我正在尝试使用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位)”现在我读了这个......
答案 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:
@