我发现这个小片段将字符串转换为字节数组:
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发送数据包,因此我需要尽可能小的数据包。
为什么数组大两倍?我该如何解决?
答案 0 :(得分:4)
.NET实际上使用UTF-16编码来存储string
和char
,这意味着每个字符实际上都是用2个字节编码的。这在Character Encoding in the .NET Framework:
公共语言运行库使用UTF-16编码来表示
Char
和String
值,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!)。