使用Encoding.GetBytes或强制转换为字节之间的区别

时间:2013-07-17 07:45:45

标签: c# encoding byte

我想知道在使用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 个答案:

答案 0 :(得分:3)

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

案文是“שועל”

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

结果

This is what I got in the watch

正如您所看到的,当您的任何字符的代码点超过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,证明结果不同。