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

时间:2013-01-06 12:01:32

标签: c# arrays string char byte

在此转换功能

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 "

我们如何制作它不会创建那些零

5 个答案:

答案 0 :(得分:6)

首先让我们来看看你的代码做错了什么。 char在.NET框架中是16位(2字节)。这意味着当您编写sizeof(char)时,它会返回2str.Length1,因此您的代码实际上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);