Python - 在文件中翻转字节的有效方法吗?

时间:2017-06-28 17:02:52

标签: python bytestring

我有一个文件夹,里面装满了非常大的文件,需要以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

2 个答案:

答案 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