用Python将字节反转AB CD为CD AB

11 投票
5 回答
67695 浏览
提问于 2025-04-17 13:47

我有一个 .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'

祝你在字节交换中玩得开心 :-)

撰写回答