python解压缩小端

我正在尝试使用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的http://docs.python.org/library/struct.html。 bitorder),上面代码的结果是X0500C000,所以LSB模式的大小是2Bytes。

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

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

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

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

ppps:<means“little-endian,标准大小(16位)”现在我读了这个...


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

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

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

下面是0xabcd在little / big-endian格式中的样子:

>>> struct.pack('<H', 0xabcd)
'xcdxab'
>>> struct.pack('>H', 0xabcd)
'xabxcd'

要从"xDCxBA"获取0XABCD ,您需要交换半字节(4位)。 这似乎很不寻常。

因为我要读取大量的数据

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

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

如果你在struct模块中使用<> ,那么标准大小是固定的并且与任何东西无关。 标准尺寸仅取决于格式字符。 特别是'<H'总是2个字节(16位), '<I'总是4个字节(32位)。 只有@前缀使用原生大小。

老答案

在这里留下它的意见是有道理的

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

>>> hi, lo = struct.unpack("<HH", "x05x00xC0x00")
>>> n = (hi << 16) | lo
>>> n
327872
>>> "0X%08X" % n
'0X000500C0'
链接地址: http://www.djcxy.com/p/11153.html

上一篇: python unpack little endian

下一篇: Value Coding @UnionOfObjects