2016-06-10 32 views
0

第一次Python應用程序,所以當然它並不容易;)用簡單的英語,這是我想要做的事:與Python 3,十六進制和添加輔助

read a binary file in, if any bytes are 0x00 change them to 0xFF, otherwise add 0x01 to each byte and write to a new file.

所以它就在那裏..my的希望是像

./convert.py file1.bin file2.bin

這是我到目前爲止有:

#!/usr/bin/env python3 
import sys 
with open(sys.argv[1], "rb") as f: 
     byte = f.read(1) 
     while byte: 
       # Do stuff with byte. 
       if byte = b'\x00' 
         byte = b'\xFF' 
       else 
         byte = byte + b'\x01' 
       byte = f.read(1) 

但是這就是我至今...顯然這爲v破碎了。我認爲這將是一個很好的學習機會......感謝您能夠給予的任何幫助。

+1

恰好爲0xFF什麼,因爲加0×01到需要它的字節值的範圍呢?你的意思是「如果有任何字節是0xFF將它們改爲0x00 ...」,這會更有意義嗎? –

+0

感謝您的快速響應,但沒有...我真的想要0x00更改爲0xFF。現在,我得到一個錯誤與此設置: 文件「./convert.py」,第14行 如果字節= B‘\ XFF’ ^ 語法錯誤:無效的語法 – DigiAngel

+0

關閉我的頭頂,你需要打開一個文件寫入,可能用'open(sys.argv [2],「wb」)',將字節連接在一起連接它們,而不是自己添加字節。 – mwchase

回答

1

首先,你有一個在if byte = b'\x00'行的錯誤,你的意思是==。這是軟件開發中最危險的錯誤之一,這就是爲什麼python不允許在條件內分配的原因。 其次,更好地檢查字節的長度,因爲python從文件中讀取字節數爲bytes。所以,在文件末尾,你會得到一個空列表bytes

現在的代碼:

#!/usr/bin/env python3 
import sys 

with open(sys.argv[1], "rb") as fin, open(sys.argv[2], "wb") as fout: 
     byte = fin.read(1) 
     while len(byte): 
       # Do stuff with byte. 
       if byte == b'\x00' 
         byte = b'\xFF' 
       else 
         byte = bytes((ord(byte) - 1,)) 
       fout.write(byte) 
       byte = fin.read(1) 
+0

「如果讀取一個\ x00字節,則不會繼續下一次迭代,因爲在這種情況下字節的布爾值爲false。」這似乎並不是正確的: '>>>布爾(B「\ X00」)' TRUE; – mwchase

+0

哇感謝這個....有趣的是我還得到一個錯誤: 文件」。 /convert.py「,第8行 if byte == b'\ x00' ^ SyntaxError:invalid syntax 不知道它是我的python版本嗎?這是3.5.1。再次感謝。 – DigiAngel

+1

@DigiAngel if-condition和else之後需要冒號。 – mwchase