python unpack little endian

时间:2012-08-28 16:25:16

标签: python

我正在尝试使用Python读取二进制文件。该文件处于LSB模式。我导入struct模块并使用unpack:

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.bitorder的http://docs.python.org/library/struct.html),上面代码的结果是X0500C000,因此LSB模式的大小是2Bytes。

我该如何解决这个问题?

无论这个问题是否得到回答,我都会继续挖掘,如果我得到了什么,我会更新。

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

pps:由于我要阅读大量数据,这是阅读中的一般问题,所以手动方式对我来说不是最好的。问题仍然是开放的答案。

ppps:&lt;意思是“小端,标准尺寸(16位)”现在我读了这个......

1 个答案:

答案 0 :(得分:3)

  

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

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

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

以下是{/ 1}}以小/大端格式显示的内容:

0xabcd

要从>>> struct.pack('<H', 0xabcd) '\xcd\xab' >>> struct.pack('>H', 0xabcd) '\xab\xcd' 获取0XABCD,您需要交换半字节(4位)。这似乎很不寻常。

  

因为我要阅读大量的数据

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

  

&LT;意思是“小端,标准尺寸(16位)”

如果您将struct<>模块一起使用,则标准尺寸是固定的,并且与任何内容无关。 Standard size depends only on the format character。特别是struct总是2个字节(16位),'<H'总是4个字节(32位)。只有'<I'前缀使用原生大小。

旧答案

留在这里让评论有意义

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

@