将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

将string转换为byte[]将创建零字符

首先让我们看看代码哪里出错了。char是。net框架中的16位(2字节)。这意味着当你写sizeof(char)时,它返回2str.Length1,所以实际上你的代码将是byte[] bytes = new byte[2]是相同的byte[2]。因此,当您使用Buffer.BlockCopy()方法时,实际上是将2字节从源数组复制到目标数组。这意味着如果字符串是" ",则GetBytes()方法返回bytes[0] = 32bytes[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"