文件内容的字节顺序

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 显示它们时以相反的顺序显示它们。