8

我正在尝试使用 Python 读取二进制文件。该文件处于 LSB 模式。我导入结构模块并像这样使用解包:

f=open(sys.argv[1],'rb')
contents= unpack('<I',f.read(4))[0]
print contents
f.close()

文件中的数据在LSB模式下为0XC0000500,实际值为0X000500C0。所以你可以看到 LSB 模式的最小尺寸是每字节。

但是,我使用的是 Mac 机器,可能是因为我的 gcc 或机器的版本(我不确定。我刚刚阅读了有关 sizeof 和 sys.html的http://docs.python.org/library/struct.html 。 bitorder),上面代码的结果是X0500C000,所以LSB模式的大小是2Bytes。

我应该如何解决这个问题?

无论这个问题是否得到回答,我都会继续挖掘,如果我得到任何东西,我会更新。

ps:数据文件是32位机器的ELF文件。

pps:由于我要读取大量数据,而且这是读取中普遍存在的问题,所以手动方式对我来说不是最好的。问题仍然有待解答。

ppps: < 表示“小端,标准大小(16 位) ” 现在我读到这个......

4

1 回答 1

6

如果实际值为 OXABCD,则文件存储 DCBA。

通常字节顺序定义字节顺序,而不是字节内的各个位。 "\xDC\xBA"是两个字节(16 位)。如果交换字节;所有可能的结果是:

>>> "0X%04X" % struct.unpack("<H", binascii.unhexlify("DCBA"))
'0XBADC'
>>> "0X%04X" % struct.unpack(">H", binascii.unhexlify("DCBA"))
'0XDCBA'

以下是0xabcdlittle/big-endian 格式的外观:

>>> struct.pack('<H', 0xabcd)
'\xcd\xab'
>>> struct.pack('>H', 0xabcd)
'\xab\xcd'

要从中获取0XABCD"\xDC\xBA"您需要交换半字节(4 位)。这似乎不寻常。

因为我要读取大量数据

您可以使用array模块一次读取多个值。它使用与模块相同的类型格式struct

< 表示“小端,标准大小(16 位)”

如果您<>struct模块一起使用,则标准尺寸是固定的并且独立于任何东西。标准大小仅取决于格式字符。特别'<H'是总是2字节(16位),'<I'总是4字节(32位)。只有@前缀使用本机尺寸。

旧答案

把它留在这里让评论有意义

您可以将其读取为 2 个字节的值并手动转换为 int:

>>> hi, lo = struct.unpack("<HH", "\x05\x00\xC0\x00")
>>> n = (hi << 16) | lo
>>> n
327872
>>> "0X%08X" % n
'0X000500C0'
于 2012-08-28T16:34:22.210 回答