2017-06-28 37 views
1

我有一個文件夾,裏面裝滿了需要通過4次方翻轉的非常大的文件。所以基本上,我需要將文件讀作二進制文件,調整位的順序,然後編寫一個新的二進制文件文件的位已調整。Python - 有效的方法來翻轉文件中的字節?

從本質上說,我想要做的是讀一個十六進制字符串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的冪的文件中的十六進制值?

....對於它的價值,有一個名爲WinHEX的工具,可以手動執行此操作,並且只需要最多一分鐘即可翻轉整個文件....我只是希望用python自動執行此操作我們不必每次都手動使用WinHEX

+0

所以...你想改變32位數字的字尾嗎? – kay

+1

所以,你想要將你的二進制4字節整數從小端轉換爲大端或反過來?你應該使用['struct'](https://docs.python.org/3/library/struct.html)。 –

+0

[python unpack little endian]可能的重複(https://stackoverflow.com/questions/12163549/python-unpack-little-endian) –

回答

2

您想要將4字節整數從小端轉換爲大端或反過來。您可以使用該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) 
+0

你能解釋一下「if not d」在loup中做什麼嗎?我看不出「d」在哪裏定義 - 所以對此有點困惑。謝謝您的幫助! – occvtech

+0

**如果不是d **,則d **爲真如果d爲無,即如果沒有更多數據要讀取 – SEDaradji

2

這裏是一個小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

+0

哦,'iter_unpack'很酷。我認爲這比手動執行read()更快嗎? –

+0

我正準備在我的一個測試文件上測試struct.iter_unpack。在解包這些位之前,我是否還需要在''read binary''中使用open()'或者是否有一種更直接的方法來直接從文件的二進制值中解壓縮?謝謝你的幫助! – occvtech

+0

我測試過'iter_unpack',但它不適用於緩衝或無緩衝的文件對象。所以你必須將文件作爲一個整體讀入到一個字節對象中,或者手動循環,就像我所顯示的那樣。或者我做錯了什麼? –

相關問題