我想知道在使用Encoding.UTF8.GetBytes
将字符转换为字节或在字符之前手动使用(byte)
并将它们转换为字节之间是否存在任何差异?
例如,请查看以下代码:
public static byte[] ConvertStringToByteArray(string str)
{
int i, n;
n = str.Length;
byte[] x = new byte[n];
for (i = 0; i < n; i++)
{
x[i] = (byte)str[i];
}
return x;
}
var arrBytes = ConvertStringToByteArray("Hello world");
或
var arrBytes = Encoding.UTF8.GetBytes("Hello world");
答案 0 :(得分:3)
我喜欢这个问题所以我用希伯来语的ANSI文本执行了你的代码,我从一个文本文件中读取。
案文是“שועל”
string text = System.IO.File.ReadAllText(@"d:\test.txt");
var arrBytes = ConvertStringToByteArray(text);
var arrBytes1 = Encoding.UTF8.GetBytes(text);
结果
正如您所看到的,当您的任何字符的代码点超过byte
的0-255范围时,会有所不同。
答案 1 :(得分:1)
当想要编写具有编码的字符时,你不能使用第一个,你必须说选择编码标准
答案 2 :(得分:1)
您的ConvertStringToByteArray
方法不正确。
您将每个char
转换为字节。 char
的数值是它的Unicode代码点,它可能大于一个字节,因此转换通常会导致算术溢出。
您的示例有效,因为您使用了代码点在byte
范围内的字符。
答案 3 :(得分:0)
是的,有区别。所有.Net字符串都存储为UTF16 LE。
使用此代码生成测试字符串,因此您可以在字符中获得高位字节,即在UTF8和UTF16中具有不同表示形式的字符。
var testString = new string(
Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)
.Select(Convert.ToChar)
.ToArray());
这会生成一个包含每个可能的char值的字符串。如果你这样做
ConvertStringToByteArray(testString).SequenceEqual(
Encoding.UTF8.GetBytes(testString));
它将返回false
,证明结果不同。