文件内容的字节顺序
Byte order of file content
我将单个西里尔字符 А
写入文件。它在 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
会产生正确的结果。我想知道为什么尽管按位运算符是字节序独立的,但结果却不同?
在 puts(bstr32(*((unsigned short*) buff)))
中,你在内存中取两个字节并将它们加载为 short
,在你的 C 实现中,将低地址字节放在 short
,然后 short
先显示其高位。
所以字节在文件中的方式与它们最初在内存中的方式相同,但是您尝试使用 short
显示它们时以相反的顺序显示它们。
我将单个西里尔字符 А
写入文件。它在 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
会产生正确的结果。我想知道为什么尽管按位运算符是字节序独立的,但结果却不同?
在 puts(bstr32(*((unsigned short*) buff)))
中,你在内存中取两个字节并将它们加载为 short
,在你的 C 实现中,将低地址字节放在 short
,然后 short
先显示其高位。
所以字节在文件中的方式与它们最初在内存中的方式相同,但是您尝试使用 short
显示它们时以相反的顺序显示它们。