十六进制值的写入顺序错误

时间:2012-03-26 20:51:46

标签: c hex

使用以下代码写入文件

int main(int argc, char * argv[])
{
    uint32_t pattern1, pattern2;
    int i, times;
    sscanf("ae75db0f", "%x", &pattern1); 
    sscanf("518a24f0", "%x", &pattern2);
    FILE * outFile = fopen(argv[1],"wb");
    printf ("Pattern 1: %0x \nPattern 2: %0x \n", pattern1, pattern2);

    times = 524288; // Write out 4 mB of data

    for (i = 0; i < times; i++) {
        fwrite(&pattern1, 4, 1, outFile);
        fwrite(&pattern2, 4, 1, outFile);
    }
    fclose (outFile);
}

在命令行上我执行xxd file |少

00018c0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.
00018d0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.
00018e0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.
00018f0: f024 8a51 0fdb 75ae f024 8a51 0fdb 75ae  .$.Q..u..$.Q..u.

它没有显示应该写入文件本身的“正确”值。

5 个答案:

答案 0 :(得分:3)

欢迎来到字母序列世界:

http://en.wikipedia.org/wiki/Endianness

x86 / x64体系结构(与现今的大多数体系结构一样)都是小端:它意味着多字节值存储在内存中,首先是最低有效字节(低内存地址)。

答案 1 :(得分:2)

要详细说明@ ouah的答案,您必须确定系统的字节序。

在此示例中,您必须反转示例中的字节顺序,如下所示:

pattern1 = (pattern1 >> 16) | (pattern1 << 16);

答案 2 :(得分:1)

您发现了Endianness。如果您想要改变顺序,请查看htonl等函数。

答案 3 :(得分:1)

它可能显示正确的顺序,事实是,如果不了解您的平台Endianness,就无法做出这样的断言。

这是一个很好的例子,为什么在读取非字节和写出字节时应该非常小心。

答案 4 :(得分:1)

如果你在同一台机器上将它们作为uint32_t读回来,它们会以相同的值返回。

如果查看基础char,您在磁盘上看到的内容与您在内存中看到的内容相同。