UTF-32编码的字符串包含意外顺序的字节

时间:2017-06-26 08:56:11

标签: c#

我有以下代码:

var x = char.ConvertFromUtf32(0x0001F642);

var enc = new UTF32Encoding();
var bytes = enc.GetBytes(x);
var hex = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
    if (i % 4 != 3)
        continue;


    hex.AppendFormat("{0:x2}", bytes[i - 0]);
    hex.AppendFormat("{0:x2}", bytes[i - 1]);
    hex.AppendFormat("{0:x2}", bytes[i - 2]);
    hex.AppendFormat("{0:x2}", bytes[i - 3]);
}
var o = hex.ToString();
//results in 0001F642

此代码尝试将UTF-32中的字符串解析为十六进制十进制值,但我面临的问题是表示字符的4字节是向后的。这是给定的还是我做错了什么?

所以没有我的i - 0, i - 1, i - 2, i - 3并且只是形成字节数组,结果就是

var x = char.ConvertFromUtf32(0x0001F642);

var enc = new UTF32Encoding();
var bytes = enc.GetBytes(x);
var hex = new StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
    hex.AppendFormat("{0:x2}", bytes[i]);
}
var o = hex.ToString();
//results is 42f60100

1 个答案:

答案 0 :(得分:3)

事实上,有两种(不兼容的)UTF-32变体:big-endian and little-endian

默认情况下,C#将UTF-32编码为小端(但它可以encode big-endian UTF-32 as well)。

因此,您的第一个代码示例创建了big-endian变体,第二个示例创建了little-endian变体。