用 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 ”,是正确的。
求解惑,先谢过。
1
canautumn 2017-01-06 02:55:32 +08:00 1
楼主没听说过 Little Endian, Big Endian?
|
2
sfqtsh 2017-01-06 03:16:19 +08:00 via Android
一般的十六进制显示都是以单个字节为单位显示: 0xHL , H 是高四位, L 是低四位。
|
3
longear 2017-01-06 03:49:08 +08:00
磁盘和内存中数据的存储都是 “低位在前 高位在后”
|
4
lln133208 2017-01-06 08:54:03 +08:00 1
字节序问题
|
5
Izual_Yang 2017-01-06 09:06:37 +08:00
按字节反过来不是对的么?
|