V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
giskard
V2EX  ›  问与答

关于二进制文件的问题

  •  
  •   giskard · 2017-01-06 02:27:54 +08:00 · 1684 次点击
    这是一个创建于 2883 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 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 ”,是正确的。

    求解惑,先谢过。

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

    @lln133208 对,就是这个,我 Google 之后明白了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5928 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 06:09 · PVG 14:09 · LAX 22:09 · JFK 01:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.