jam*_*909 6 python byte reversing
我有一个.bin文件,我想简单地反转十六进制数据.比如说@ 0x10它读取AD DE DE C0,想要它读取DE AD C0 DE.
我知道有一个简单的方法可以做到这一点,但我是初学者,只是学习python,我正在尝试制作一些简单的程序来帮助我完成日常任务.我想以这种方式转换整个文件,而不仅仅是0x10.
我将在起始偏移量0x000000处进行转换,并且blocksize/length为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()
Run Code Online (Sandbox Code Playgroud)
并且您可以看到用于反转的模块,我已经尝试了许多不同的建议,它将通过未触摸传递文件,否则将抛出错误.我知道模块反向现在是空的,但我已经尝试了各种各样的东西.我只需要模块反转将AB CD转换为CD AB.感谢任何输入
编辑:文件是16 MB,我想颠倒整个文件的字节顺序.
小智 11
在Python 3.4中,您可以使用:
>>> data = b'\xAD\xDE\xDE\xC0'
>>> swap_data = bytearray(data)
>>> swap_data.reverse()
Run Code Online (Sandbox Code Playgroud)
结果是
bytearray(b'\xc0\xde\xde\xad')
Run Code Online (Sandbox Code Playgroud)
在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'
Run Code Online (Sandbox Code Playgroud)
在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'
Run Code Online (Sandbox Code Playgroud)
您还可以在struct模块中使用<
and >
endianess格式代码来实现相同的结果:
>>> struct.pack('<2h', *struct.unpack('>2h', original))
'\xde\xad\xc0\xde'
Run Code Online (Sandbox Code Playgroud)
快乐的字节交换 :-)
data = b'\xAD\xDE\xDE\xC0'
reversed_data = data[::-1]
print(reversed_data)
# b'\xc0\xde\xde\xad'
Run Code Online (Sandbox Code Playgroud)