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

问题描述 投票:0回答:5

我有一个 .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。 感谢您的任何意见

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

python byte reversing
5个回答
21
投票
data = b'\xAD\xDE\xDE\xC0'
reversed_data = data[::-1]
print(reversed_data)
# b'\xc0\xde\xde\xad'

19
投票

在Python 3.4中你可以使用这个:

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

结果是

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

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 module
中使用
<
> endianess 格式代码来实现相同的结果:

>>> struct.pack('<2h', *struct.unpack('>2h', original))
'\xde\xad\xc0\xde'

快乐字节交换:-)


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
© www.soinside.com 2019 - 2024. All rights reserved.