我有一个.bin 文件,我想简单地字节反转十六进制数据。例如 @ 0x10 它读取 AD DE DE C0,希望它读取 DE AD C0 DE。
我知道有一个简单的方法来做到这一点,但我是初学者,只是学习 python,并试图做一些简单的程序来帮助我完成我的日常任务。
我将在开始偏移 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()
你可以看到模块反转,我已经尝试了许多不同的建议,它将通过 untouched 传递文件,或者它会抛出错误。我知道模块反转现在是空的,但是我已经尝试了各种各样的东西。我只需要模块反向将 AB CD 转换为 CD AB。谢谢任何输入
编辑:该文件是 16 MB,我想扭转整个文件的字节顺序。
在 Python 3.4 中,你可以使用这个:
>>> data = b'\xAD\xDE\xDE\xC0'
>>> swap_data = bytearray(data)
>>> swap_data.reverse()
结果是
bytearray(b'\xc0\xde\xde\xad')
在 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'
快乐byte swapping:-)
data = b'\xAD\xDE\xDE\xC0'
reversed_data = data[::-1]
print(reversed_data)
# b'\xc0\xde\xde\xad'
Python3
bytes(reversed(b'\xAD\xDE\xDE\xC0'))
# b'\xc0\xde\xde\xad'
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(11条)