用Python将字节反转AB CD为CD AB
我有一个 .bin 文件,我想把里面的十六进制数据的字节顺序反转。比如在地址 0x10 处,它现在是 AD DE DE C0,我想让它变成 DE AD C0 DE。
我知道有简单的方法可以做到这一点,但我还是个初学者,刚开始学习 Python,想写一些简单的程序来帮助我完成日常任务。我希望能把整个文件都这样转换,而不仅仅是 0x10 这个位置。
我打算从偏移量 0x000000 开始,块大小/长度是 1000000。
这是我的代码,也许你能告诉我该怎么做。我知道我可能没有理解清楚,因为我对编程和 Python 还很陌生。如果你能帮我,我会非常感激。
def main():
infile = open("file.bin", "rb")
new_pos = int("0x000000", 16)
chunk = int("1000000", 16)
data = infile.read(chunk)
reverse(data)
def reverse(data):
output(data)
def output(data):
with open("reversed", "wb") as outfile:
outfile.write(data)
main()
你可以看到我用来反转的模块,我尝试了很多不同的建议,但要么文件没有变化,要么会报错。我知道现在模块 reverse 是空的,但我试过各种方法。我只需要这个模块把 AB CD 转换成 CD AB。
谢谢你的任何建议。
补充:这个文件有 16 MB,我想反转整个文件的字节顺序。
5 个回答
19
在Python 3.4中,你可以使用这个:
>>> data = b'\xAD\xDE\xDE\xC0'
>>> swap_data = bytearray(data)
>>> swap_data.reverse()
结果是
bytearray(b'\xc0\xde\xde\xad')
20
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。
17
在Python 2中,读取二进制文件时会把它当作字符串来处理,所以我们可以很简单地通过字符串切片来交换相邻的字节。
>>> original = '\xAD\xDE\xDE\xC0'
>>> ''.join([c for t in zip(original[1::2], original[::2]) for c in t])
'\xde\xad\xc0\xde'
而在Python 3中,读取二进制文件时会把它当作字节来处理。只需要稍微修改一下,就能构建另一个字节数组。
>>> original = b'\xAD\xDE\xDE\xC0'
>>> bytes([c for t in zip(original[1::2], original[::2]) for c in t])
b'\xde\xad\xc0\xde'
你还可以使用<
和>
这些字节序格式代码,在struct模块中实现同样的效果。
>>> struct.pack('<2h', *struct.unpack('>2h', original))
'\xde\xad\xc0\xde'
祝你在字节交换中玩得开心 :-)