Python—翻转文件中字节的有效方法?

Python—翻转文件中字节的有效方法?,python,Python,我有一个文件夹,里面装满了非常大的文件,需要按4的幂进行字节翻转。所以本质上,我需要将文件作为二进制文件读取,调整位序列,然后编写一个新的二进制文件,调整位 本质上,我要做的是读取一个十六进制字符串hextstring,如下所示: “00112233AABBCCDD” 然后编写一个如下所示的文件: “33221100DDCCBBAA” (即每两个字符是一个字节,我需要将字节翻转4次方) 一般来说,我对python和编码非常陌生,目前完成这项任务的方式效率极低。我的代码当前如下所示: import

我有一个文件夹,里面装满了非常大的文件,需要按4的幂进行字节翻转。所以本质上,我需要将文件作为二进制文件读取,调整位序列,然后编写一个新的二进制文件,调整位

本质上,我要做的是读取一个十六进制字符串
hextstring
,如下所示: “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
导入binascii
将open(myFile,'rb')作为f:
content=f.read()
hexString=str(binascii.hexlify(内容))
flippedBytes=“”
inc=0
当inc
我在上面粘贴的代码准确地完成了我需要的内容(注意,我的实际代码中有几行额外的:“hextstring.replace()”,以删除不必要的十六进制字符,但为了使上面的内容更易于阅读,我省略了这些行)。我的最终问题是,使用较大的文件运行代码需要非常长的时间。我需要翻转的一些文件的大小几乎为2gb,而完成一个文件的代码几乎需要半天的时间。我有几十个文件需要在上面运行,所以这个时间框架根本不实用

是否有更有效的方法将文件中的十六进制值翻转4次方


。。。。值得一提的是,有一个名为WinHEX的工具可以手动执行此操作,最多只需一分钟即可翻转整个文件。。。。我只是希望用python实现这一点的自动化,这样我们就不必每次都手动使用WinHEX了

您想要将4字节整数从小端转换为大端,或者反之亦然。您可以使用该模块进行以下操作:

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)
导入结构
打开(myfile,'rb')作为内嵌,打开(myoutput,'wb')作为:
尽管如此:
d=填充读取(4)
如果不是d:
打破
le=结构解包('I',*le)
of.write(be)
以下是一些让您开始学习的精彩内容:

>>> 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'
导入结构 >>>s=b'\x00\x11\x22\x33\xAA\xBB\xCC\xDD' >>>a,b=结构拆包('II',a,b) >>>''.join([格式(x,'02x')表示s中的x]) “33221100ddccbbaa”

要以全速进行大输入,请使用

So。。。您想更改32位数字的尾数吗?那么,您想将二进制4字节整数从小尾数转换为大尾数,或者反之亦然?你应该使用。可能重复的哦,
iter\u unpack
很酷。我认为这比手动执行
read()
s快?我正在准备对我的一个测试文件进行test struct.iter\u解包。在解压缩位之前,我是否仍然需要在
读取二进制文件
模式下使用open()
,或者是否有更直接的方法直接从文件的二进制值解压缩?谢谢你的帮助!我已经测试了iter_解包,但它不能处理缓冲或非缓冲文件对象。因此,您必须将文件作为一个整体读取到一个bytes对象中,或者手动循环,如我所示。或者我做错了什么?你能解释一下“如果不是d”在loup中做了什么吗?我看不出“d”的定义在哪里,所以对此有点困惑。谢谢你的帮助!如果没有,则d为真,如果d为无,则d为真