gpt4 book ai didi

python解压小端

转载 作者:太空狗 更新时间:2023-10-29 21:07:38 25 4
gpt4 key购买 nike

我正在尝试使用 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或者机器的版本(我不确定。我只是看了http://docs.python.org/library/struct.html关于sizeof和sys.bitorder),结果从上面的代码是X0500C000,所以LSB模式的大小是2Bytes。

我该如何解决这个问题?

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

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

pps:由于我要阅读大量的资料,而且这是阅读中的普遍问题,所以手动方式对我来说不是最好的。问题仍然悬而未决。

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

最佳答案

if the actual value is OXABCD, then the file stores DCBA.

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

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

这是如何0xabcd看起来像小/大端格式:

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

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

Since I am going to read a huge amount of data

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

< means "little-endian,standard size (16 bit)"

如果您使用 <>struct模块然后标准尺寸是固定的并且独立于任何东西。 Standard size depends only on the format character .特别是'<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'

关于python解压小端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com