我有以下代码:
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
答案 0 :(得分:3)
事实上,有两种(不兼容的)UTF-32变体:big-endian and little-endian。
默认情况下,C#将UTF-32编码为小端(但它可以encode big-endian UTF-32 as well)。
因此,您的第一个代码示例创建了big-endian变体,第二个示例创建了little-endian变体。