在这个转换功能
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 "
我们如何做它,所以它不会产生这些零
首先,让我们看看你的代码确实错了。 char
是16位(2字节)的.NET框架。 当你写这意味着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个字节存储到字节阵列,有发生的数据丢失。 因此,零上显示的是结果。
至于建议, Encoding.ASCII.GetBytes
是使用更安全的选择。
在现实中达网络(至少4.0)当用的BinaryWriter序列自动改变炭的大小
UTF-8字符具有可变长度(可能不是1个字节),字符的ASCII具有1个字节
“E” = 2个字节
'E'= 1字节
必须使用时要牢记
BinaryReader.ReadChars(stream)
在“ēvalds”字= 7个字节的情况下的大小会比“evalds” = 6个字节不同
(97.0)为 'a' 的Unicode表示。 的Unicode表示在两个字节的每个字符。 所以,你不能删除零。 但你可以改变编码为ASCII。 试试下面的字符串转换为byte []。
byte[] array = Encoding.ASCII.GetBytes(input);
尝试指定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"
,你可能会预期