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