切换字符串字节序的简单方法



我需要读取二进制文件,并以文本文件的形式写入它的内容,这将初始化内存模型。问题是,我需要在过程中切换恩迪亚。让我们看一下示例 二进制文件内容,当我用:

with open(source_name, mode='rb') as file:
fileContent = file.read().hex()

文件内容:"aa000000bb000000...".
我需要,把它转化为"000000aa000000bb...".
当然,我可以将此字符串拆分为 8 个字符子字符串的列表,而不是像newsubstr = substr[6:8]+substr[4:6]+substr[2:4]+substr[0:2] 那样手动重组它,然后将它们合并为结果字符串,但这似乎很笨拙,我想在 python 中还有更自然的方法可以做到这一点。

多亏了k1m190r,我发现了结构模块,它看起来像我需要的,但我仍然迷失了。我刚刚设计了另一个笨拙的解决方案:

with open(source_name, mode='rb') as file:
fileContent = file.read()
while len(fileContent)%4 != 0:
fileContent += b"x00"
res = ""
for i in range(0,len(fileContent),4):
substr = fileContent[i:i+4]
substr_val = struct.unpack("<L", substr)[0]
res += struct.pack(">L", substr_val).hex()

还有比这更优雅的方式吗?此解决方案仅比原始解决方案略好。

实际上,在您的特定情况下,您甚至不需要struct.下面应该足够了。

from binascii import b2a_hex
# open files in binary 
with open("infile", "rb") as infile, open("outfile", "wb") as outfile:
# read 4 bytes at a time till read() spits out empty byte string b""
for x in iter(lambda: infile.read(4), b""):
if len(x) != 4:
# skip last bit if it is not 4 bytes long
break
outfile.write(b2a_hex(x[::-1]))

有没有更优雅的方式?这个解决方案只是比原来的略好

或者,您可以制作一个"更智能"的结构格式字符串:格式说明符采用数字前缀,即重复次数,例如10LLLLLLLLLLL相同,因此您可以在字母之前注入数据大小除以 4 并一次性转换整个内容(或几个步骤,我不知道计数器可以有多大)。

array.array也可以工作,因为这就是'byteswap',但你不能指定输入字节序(我认为),所以它更不稳定。

要回答原始问题:

import re
changed = re.sub(b'(....)', lambda x:x.group()[::-1], bindata)
  • 注意:原件r'(....)'r应该b的时间。

最新更新