将string转换为byte[]将创建零字符
本文关键字:创建 字符 byte string 转换 | 更新日期: 2023-09-27 17:50:46
在此转换函数
public static byte[] GetBytes(string str)
{
byte[] bytes = new byte[str.Length * sizeof(char)];
System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
byte[] test = GetBytes("abc");
结果数组包含0个字符
test = [97, 0, 98, 0, 99, 0]
当我们将byte[]转换回string时,结果是
string test = "a b c "
我们如何使它不产生那些0
首先让我们看看代码哪里出错了。char
是。net框架中的16位(2字节)。这意味着当你写sizeof(char)
时,它返回2
。str.Length
是1
,所以实际上你的代码将是byte[] bytes = new byte[2]
是相同的byte[2]
。因此,当您使用Buffer.BlockCopy()
方法时,实际上是将2
字节从源数组复制到目标数组。这意味着如果字符串是" "
,则GetBytes()
方法返回bytes[0] = 32
和bytes[1] = 0
。
尝试使用Encoding.ASCII.GetBytes()
代替。
在派生类中被重写时,对类中的所有字符进行编码将指定的字符串转换为字节序列。
const string input = "Soner Gonul";
byte[] array = Encoding.ASCII.GetBytes(input);
foreach ( byte element in array )
{
Console.WriteLine("{0} = {1}", element, (char)element);
}
输出:83 = S
111 = o
110 = n
101 = e
114 = r
32 =
71 = G
111 = o
110 = n
117 = u
108 = l
只是为了澄清你对答案的困惑,c#中的char类型需要2个字节。因此,string.toCharArray()返回一个数组,其中每个项目占用2字节的存储空间。当复制到每个项占用1字节存储空间的字节数组时,会发生数据丢失。因此结果中出现了0。
按照建议,Encoding.ASCII.GetBytes
是一个更安全的选择。
实际上。net(至少对于4.0)在使用BinaryWriter序列化时自动更改char的大小
UTF-8字符具有可变长度(可能不是1字节),ASCII字符具有1字节
' æ ' = 2字节
'e' = 1字节
在使用
时必须牢记BinaryReader.ReadChars(stream)
如果单词"ēvalds" = 7字节大小将不同于"evalds" = 6字节
(97,0)是'a'的Unicode表示形式。Unicode用两个字节表示每个字符。所以不能去掉0。但是您可以将Encoding更改为ASCII。
将字符串转换为字节[]。byte[] array = Encoding.ASCII.GetBytes(input);
尝试显式指定Encoding
。您可以使用next代码将字符串转换为具有指定编码
byte[] bytes = System.Text.Encoding.ASCII.GetBytes("abc");
如果打印字节的内容,您将得到不包含零的{ 97,
98,
99 }
,如您的示例所示在您的示例中,默认编码使用每个符号16位。可以通过打印
System.Text.Encoding.Unicode.GetBytes("abc"); // { 97, 0, 98, 0, 99, 0 }
然后在转换回来的时候,你应该选择合适的编码:
string str = System.Text.Encoding.ASCII.GetString(bytes);
Console.WriteLine (str);
按预期打印"abc"