在此转换功能
中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 "
我们如何制作它不会创建那些零
答案 0 :(得分:6)
首先让我们来看看你的代码做错了什么。 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
答案 1 :(得分:1)
为了清除对你的答案的困惑,C#中的char类型需要2个字节。因此,string.toCharArray()返回一个数组,其中每个项目占用2个字节的存储空间。在复制到每个项目占用1个字节的字节数组时,会发生数据丢失。因此,结果中显示零。
根据建议,Encoding.ASCII.GetBytes
是一种更安全的选择。
答案 2 :(得分:1)
实际上.net(至少4.0版)在使用BinaryWriter序列化时会自动更改char的大小
UTF-8字符的长度可变(可能不是1个字节),ASCII字符有1个字节
'ē'= 2个字节
'e'= 1个字节
使用
时必须牢记BinaryReader.ReadChars(stream)
如果单词“ēvalds”= 7字节大小将不同于“evalds”= 6字节
答案 3 :(得分:0)
尝试明确指定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"
答案 4 :(得分:0)
(97,0)是'a'的Unicode表示。 Unicode表示两个字节中的每个字符。所以你不能删除零。但您可以将编码更改为ASCII。尝试将字符串转换为byte []。
byte[] array = Encoding.ASCII.GetBytes(input);