我有一个文件夹,里面装满了非常大的文件,需要以4的幂进行字节翻转。所以基本上,我需要将文件作为二进制文件读取,调整位序列,然后再写一个新文件调整了位的二进制文件。
从本质上讲,我要做的是读取十六进制字符串hexString
,如下所示:
“00112233AABBCCDD”
并编写一个如下所示的文件: “33221100DDCCBBAA”
(即每两个字符是一个字节,我需要以4的幂翻转字节)
我对python和编码很新,我目前完成这项任务的方式非常低效。我的代码目前看起来像这样:
import binascii
with open(myFile, 'rb') as f:
content = f.read()
hexString = str(binascii.hexlify(content))
flippedBytes = ""
inc = 0
while inc < len(hexString):
flippedBytes += file[inc + 6:inc + 8]
flippedBytes += file[inc + 4:inc + 6]
flippedBytes += file[inc + 2:inc + 4]
flippedBytes += file[inc:inc + 2]
inc += 8
..... write the flippedBytes to file, etc
我上面粘贴的代码准确地完成了我需要的东西(请注意,我的实际代码有一些额外的行:“hexString.replace()”来删除不必要的十六进制字符 - 但我已经把它们留下来做以上更容易阅读)。我的最终问题是,使用较大的文件运行我的代码需要花费很长时间。我需要翻转的一些文件大小几乎是2GB,代码几乎需要半天才能完成一个文件。我有几十个文件需要运行它,因此时间框架根本不实用。
是否有更有效的方法以4的幂翻转文件中的HEX值?
....为了它的价值,有一个名为WinHEX的工具可以手动执行此操作,并且只需要花费一分钟来翻转整个文件....我只是希望用python自动化这个,所以我们不必每次都手动使用WinHEX
答案 0 :(得分:2)
您希望将4字节整数从little-endian转换为big-endian,反之亦然。您可以使用struct
模块:
import struct
with open(myfile, 'rb') as infile, open(myoutput, 'wb') as of:
while True:
d = infile.read(4)
if not d:
break
le = struct.unpack('<I', d)
be = struct.pack('>I', *le)
of.write(be)
答案 1 :(得分:1)
这是一个让你开始的小struct非常棒的事情:
>>> import struct
>>> s = b'\x00\x11\x22\x33\xAA\xBB\xCC\xDD'
>>> a, b = struct.unpack('<II', s)
>>> s = struct.pack('>II', a, b)
>>> ''.join([format(x, '02x') for x in s])
'33221100ddccbbaa'
要为大输入全速执行此操作,请使用struct.iter_unpack