将字符串转换为字节数组

时间:2014-06-19 22:06:49

标签: c#

我发现这个小片段将字符串转换为字节数组:

    public byte[] GetBytes(string str)
    {
        byte[] bytes = new byte[str.Length * sizeof(char)];
        System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
        return bytes;
    }

这个将字节数组转换为字符串:

    public string GetString(byte[] bytes)
    {
        char[] chars = new char[bytes.Length / sizeof(char)];
        System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
        return new string(chars);
    }

但是我注意到第一个返回的数组是初始字符串的两倍(因为sizeof(char)= 2)并且我的数组中的每个其他插槽都是0。

示例:

string = TEST
bytes[] = { 84, 0, 69, 0, 83, 0, 84, 0 };

我正在使用此功能以UDP发送数据包,因此我需要尽可能小的数据包。

为什么数组大两倍?我该如何解决?

3 个答案:

答案 0 :(得分:4)

.NET实际上使用UTF-16编码来存储stringchar,这意味着每个字符实际上都是用2个字节编码的。这在Character Encoding in the .NET Framework

中有详细说明
  

公共语言运行库使用UTF-16编码来表示CharString值,Windows操作系统使用它来表示WCHAR值。

所以你应该期望为你的字符串中的每个字符获得2个字节。

如果您只希望每个字符获得1个字节,则必须使用不同的编码。对于此输入,ASCII encoding将起作用:

public byte[] GetBytes(string str)
{
    return System.Text.Encoding.ASCII.GetBytes(str);
}

使用输入"TEST"调用此选项将返回{ 84, 69, 83, 84 }

答案 1 :(得分:4)

为字符串使用获取字节:

Encoding.Utf8.GetBytes()

http://msdn.microsoft.com/en-us/library/system.text.encoding.getbytes(v=vs.110).aspx

回到字符串使用:

Encoding.Utf8.GetString()

http://msdn.microsoft.com/en-us/library/744y86tc(v=vs.110).aspx

答案 2 :(得分:4)

在C#中,char是一个16位数据类型,因为.NET本身使用Unicode UTF-16编码。

如果您的测试完全是ASCII数据,那么您可以使用ASCIIEncoding.GetBytes使用ASCII编码将字符串转换为字节。

使用UTF8Encoding.GetBytes使用UTF8编码转换为字节可能更好。这支持整个Unicode字符集,而不仅仅是ASCII,但是以不像UTF16那样的方式包含所有这些零字节的方式对其进行编码。

如果您需要了解有关字符编码的更多信息,还有The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)