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

11

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

你可以看到反转模块。我尝试了许多不同的建议,但要么文件保持不变,要么就会出现错误。我知道反转模块现在是空的,但我已经尝试了各种方法。我只需要反转模块将 AB CD 转换为 CD AB。

编辑:文件大小为 16MB,我想反转整个文件的字节顺序。


2
你从来没有真正地反转过任何东西... - Ignacio Vazquez-Abrams
5个回答

18
data = b'\xAD\xDE\xDE\xC0'
reversed_data = data[::-1]
print(reversed_data)
# b'\xc0\xde\xde\xad'

2
OP 要求以 2 为单位进行反转,而不是整个字节。例如 0001abcd 反转为 0100cdab。 - Melih Yıldız'

18

在Python 3.4中,您可以使用以下代码:

>>> data = b'\xAD\xDE\xDE\xC0'
>>> swap_data = bytearray(data)
>>> swap_data.reverse()

结果是

bytearray(b'\xc0\xde\xde\xad')

16
在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 module中使用<>endianess格式代码来达到相同的效果:
>>> struct.pack('<2h', *struct.unpack('>2h', original))
'\xde\xad\xc0\xde'

愉快的 字节交换 :-)


1
感谢您解释Python 2和3中字符串读取的区别。 - laycat

2

Python3

bytes(reversed(b'\xAD\xDE\xDE\xC0'))
# b'\xc0\xde\xde\xad'

0

Python有一个列表操作符来反转列表的值 --> nameOfList[::-1]

因此,我可以将十六进制值存储为字符串并将它们放入列表中,然后尝试类似以下的操作:

def reverseList(aList):
rev = aList[::-1]
outString = ""
for el in rev:
    outString += el + " "
return outString

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接