0

我正在开发一个将二进制数据(整数、双精度、原始字节)写入文件的应用程序。

问题是,数据实际上并没有按照我期望的方式写入文件:

>>> import struct
>>> import io
>>> out = io.open("123.bin", "wb+")
>>> format = "!i"
>>> data = struct.pack(format, 1)
>>> out.write(data)
4L
>>> data
'\x00\x00\x00\x01'
>>> out.close()
>>> infile = io.open("123.bin", "rb")
>>> instr = infile.read()
>>> instr
'\x00\x00\x00\x01'
>>> struct.unpack("!I", instr)
(1,)

所以一切看起来都很好。但经过仔细检查,该123.bin文件具有以下内容:

$ hexdump 123.bin 
0000000 0000 0100                              
0000004

所以看起来字节被交换了io.write()

python文档说,io.write()接受“给定字节或字节数组对象”,问题是,它struct.pack确实返回一个str

>>> type(struct.pack(format, 1))
<type 'str'>

那么,我做错了什么?如何在没有任何字符集翻译的情况下转换str为?bytes

4

3 回答 3

4

看起来这是一个奇怪的事情hexdump(1)。使用xxd(1),我得到...

$ xxd 123.bin
0000000: 0000 0001                                ....

...看起来正确。

看起来您必须使用该-C选项才能hexdump(1)以健全的格式输出...

$ hexdump -C 123.bin
00000000  00 00 00 01                                       |....|
00000004

...或将其称为hd

于 2013-06-27T17:27:15.560 回答
1

这里的问题不在于 python,而在于 hexdump。它将文件中的数据视为 16 位小端值。您需要做的是告诉 hexdump 将数据视为 8 位值。不查找它,我认为这是'-c'选项。

于 2013-06-27T17:32:30.613 回答
1

的默认输出格式hexdump与使用-x选项相同,即根据手册页:

 -x      Two-byte hexadecimal display.  Display the input offset in hexadecimal,
         followed by eight, space separated, four column, zero-filled, two-byte
         quantities of input data, in hexadecimal, per line.

使用的字节序hexdump是架构字节序(这里可能是小端序),而您要求 python 以网络顺序存储值(大端序)。

因此,该值被正确存储,但被hexdump. 您可以使用该-C选项或xxd代替hexdump.

$ hexdump 123.bin
0000000 0000 0100                              
0000004
$ hexdump -C 123.bin
00000000  00 00 00 01                                       |....|
00000004
于 2013-06-27T17:34:22.980 回答