【问题标题】:Byte order of file content文件内容的字节顺序
【发布时间】: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


【解决方案1】:

puts(bstr32(*((unsigned short*) buff))) 中,您在内存中获取两个字节并将它们作为short 加载,在您的C 实现中,将低地址字节放入short 的高位,然后将@ 987654324@先显示高位。

因此字节在文件中的方式与它们最初在内存中的方式相同,但您尝试使用 short 显示它们时以相反的顺序呈现它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多