【发布时间】:2022-01-09 02:15:35
【问题描述】:
我将单个西里尔字符А 写入文件。它在 UTF-8 编码中的十六进制表示是0xD090。然后我读取了文件的内容,但由于某种原因结果不同。
这是我用来打印数字的二进制表示的函数:
char* bstr32(int val) {
char* res = calloc(33, 1);
for (int a = 31; a >= 0; a--) {
res[a] = val & 1 ? '1' : '0';
val >>= 1;
}
return res;
}
这就是我从文件中读取数据的方式(文件大小是硬编码的,并且省略了错误检查):
int main() {
unsigned char buff[2];
read(open("data", O_RDONLY), buff, 2);
puts(bstr32(*((unsigned short*) buff)))
}
输出:00000000000000001001000011010000
相同的值但在代码中定义:
int main() {
puts(bstr32(0xD090))
}
输出:00000000000000001101000010010000
我发现从文件中读取的数据是小端格式,使用htonl 会产生正确的结果。我想知道为什么尽管按位运算符是字节序独立的,但结果却不同?
【问题讨论】:
-
UTF-8 是一系列字节,编码代码点的每个字节依次解释。相反,您正在读取一个 16 位值,其中字节序起作用。
标签: c endianness