3

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");
4

4 回答 4

3

我喜欢这个问题,所以我在从文本文件中读取的希伯来语 ANSI 文本上执行了您的代码。

文字是“שועל”

string text = System.IO.File.ReadAllText(@"d:\test.txt");
var arrBytes = ConvertStringToByteArray(text);
var arrBytes1 = Encoding.UTF8.GetBytes(text);

结果是

这是我在手表里得到的

如您所见,当您的任何字符的代码点超出byte.

于 2013-07-17T08:30:23.080 回答
1

当要转换有编码的字符时,你不能使用第一个,你必须说选择编码标准

于 2013-07-17T08:22:02.007 回答
1

你的ConvertStringToByteArray方法不正确。您将每个char转换为字节。char的数值是它的 Unicode 代码点,可能大于一个字节,因此转换通常会导致算术溢出。

您的示例有效,因为您使用了具有byte范围内代码点的字符。

于 2013-07-17T08:27:05.813 回答
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,表明结果不同。

于 2013-07-17T08:50:09.423 回答