转换字符串的byte []创建零字符(Converting string to byte[] cre

2019-08-05 18:29发布

在这个转换功能

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");

将得到的数组包含零字符

test = [97, 0, 98, 0, 99, 0]

而当我们转换的byte []返回字符串,其结果是

string test = "a b c "

我们如何做它,所以它不会产生这些零

Answer 1:

首先,让我们看看你的代码确实错了。 char是16位(2字节)的.NET框架。 当你写这意味着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


Answer 2:

只是为了澄清关于你的答案的困惑,在C#中的char类型占用2个字节。 所以,string.toCharArray()返回,其中每个项目占用2个字节的存储阵列。 而复制,其中每个项目需要1个字节存储到字节阵列,有发生的数据丢失。 因此,零上显示的是结果。
至于建议, Encoding.ASCII.GetBytes是使用更安全的选择。



Answer 3:

在现实中达网络(至少4.0)当用的BinaryWriter序列自动改变炭的大小

UTF-8字符具有可变长度(可能不是1个字节),字符的ASCII具有1个字节

“E” = 2个字节

'E'= 1字节

必须使用时要牢记

BinaryReader.ReadChars(stream)

在“ēvalds”字= 7个字节的情况下的大小会比“evalds” = 6个字节不同



Answer 4:

(97.0)为 'a' 的Unicode表示。 的Unicode表示在两个字节的每个字符。 所以,你不能删除零。 但你可以改变编码为ASCII。 试试下面的字符串转换为byte []。

byte[] array = Encoding.ASCII.GetBytes(input);


Answer 5:

尝试指定Encoding明确。 您可以使用下面的代码转换成字符串指定的编码为字节

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" ,你可能会预期



文章来源: Converting string to byte[] creates zero character