关于二进制文件的问题

2017-01-06 02:27:54 +08:00
 giskard

用 C++ 写了一个很简单的以二进制方式写入文件的测试程序,代码如下:

    int data1 = -5;
    int data2 = 512;
    ofstream out("test.txt", ios::out | ios::binary);
    out.write((char*)&data1, sizeof(data1));
    out.write((char*)&data2, sizeof(data2));
    out.close();

然后,用 xxd 查看 test.txt, 结果如下:

0000000: fbff ffff 0002 0000                      ........

第一个数是-5 ,按照负数是其正直的补码形式来表示的原则,那么-5 的二进制形式应该是

11111111 11111111 11111111 11111011 

转成十六进制应该是

FFFFFFFB

第二个数是 512 ,转换成 16 进制是

00000000 00000000 00000010 00000000

转换成十六进制应该是

0000 0200

为什么 xxd 查看的结果与预期不一样呢?

仔细看来, xxd 查看的结果,似乎与预期刚好是反过来的, xxd 的结果中右边是低位,左边是高位,而上面的计算用的是左边低位右边高位。可是,也不对, 计算得到的 -5 的十六进制码是 FFFF FFFB ,而 xxd 查看结果反过来,是 FFFF FFBF ,为什么最后的 B 与 F 的顺序似乎不对呢? 512 的也类似,计算得到的是 0000 0200 , xxd 结果翻过来是 0000 2000 ,似乎 2 的位置也是不对的?

可是,如果再用二进制的形式来读取结果,

    int indata;
    ifstream in("test.txt", ios::in | ios:: binary);
    in.read((char*)&indata, sizeof(indata));

    cout << "indata is:" << indata << endl;

输出结果是 “ indata is -5 ”,是正确的。

求解惑,先谢过。

1667 次点击
所在节点    问与答
6 条回复
canautumn
2017-01-06 02:55:32 +08:00
楼主没听说过 Little Endian, Big Endian?
sfqtsh
2017-01-06 03:16:19 +08:00
一般的十六进制显示都是以单个字节为单位显示: 0xHL , H 是高四位, L 是低四位。
longear
2017-01-06 03:49:08 +08:00
磁盘和内存中数据的存储都是 “低位在前 高位在后”
lln133208
2017-01-06 08:54:03 +08:00
字节序问题
Izual_Yang
2017-01-06 09:06:37 +08:00
按字节反过来不是对的么?
giskard
2017-01-06 11:44:04 +08:00
@canautumn 谢谢,楼主非计算机专业人士,在发帖的时候没有这个概念。经您提示, Google 之后明白了,感谢提示。

@lln133208 对,就是这个,我 Google 之后明白了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/332562

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX