我需要读取二进制文件,并以文本文件的形式写入它的内容,这将初始化内存模型。问题是,我需要在过程中切换恩迪亚。让我们看一下示例 二进制文件内容,当我用:
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]))
有没有更优雅的方式?这个解决方案只是比原来的略好
或者,您可以制作一个"更智能"的结构格式字符串:格式说明符采用数字前缀,即重复次数,例如10L
与LLLLLLLLLL
相同,因此您可以在字母之前注入数据大小除以 4 并一次性转换整个内容(或几个步骤,我不知道计数器可以有多大)。
array.array
也可以工作,因为这就是'byteswap',但你不能指定输入字节序(我认为),所以它更不稳定。
要回答原始问题:
import re
changed = re.sub(b'(....)', lambda x:x.group()[::-1], bindata)
- 注意:原件
r'(....)'
r
应该b
的时间。