2010-12-13 69 views
0

我想從二進制模式的文件讀取數據並操作該數據。讀取和寫入動態大小的二進制數據問題

try: 
    resultfile = open("binfile", "rb") 
except: 
    print "Error" 
resultsize = os.path.getsize("binfile") 

有一個32字節的頭,我解析好,然後二進制數據的緩衝區開始。數據可以是從16到4092的任何大小,並且可以是從文本到PDF或圖像或其他任何格式的任何格式。頭部有數據的大小,所以得到這個信息我做

contents = resultfile.read(resultsize) 

並且這將整個文件放入一個字符串緩衝區。我發現這可能是我的問題,因爲當我嘗試將「內容」中的十六進制數據塊複製到新文件中時,某些字節無法正確複製,因此PDF和圖像將會損壞。

在解釋器中打印出一些文件字符串緩衝區,例如「%PDF-1.5 \ r \ n%\ xb5 \ xb5 \ xb5 \ xb5 \ r \ n1 0 obj \ r \ n」當我只是想自己的字節,以便將它們寫入一個新的文件。有沒有一個簡單的解決方案來解決這個我缺少的問題?

這裏是我的Python編寫的PDF格式和PDF真正的十六進制轉儲的例子:

25 50 44 46 2D 31 2E 35 0D 0D 0A 25 B5 B5 B5 B5 0D 0D 0A 31 20 30 20 6F 62 6A 0D 0D 0A 

25 50 44 46 2D 31 2E 35 0D 0A 25 B5 B5 B5 B5 0D 0A 31 20 30 20 6F 62 6A 

好像被添加0D每當有0D 0A。在圖像文件中,它可能是一個不同的字節,我不記得也可能需要測試它。 我的代碼寫入新文件非常簡單,使用內容作爲保存所有數據的字符串緩衝區。

 fbuf = contents[offset+8:size+offset] 
     fl = open(fname, 'a') 
     fl.write(fbuf) 

這是在基於標題中找到的簽名的循環中調用的。偏移+8是實際pdf數據的開始,大小是要複製的塊的大小。

+2

你可以叫'resultfile.read()'讀取整個文件。 – 2010-12-13 17:48:04

+0

'resultfile.read()'將以字符串的形式返回文件的全部內容。你有沒有理由首先抓住尺碼? – nmichaels 2010-12-13 17:49:53

+0

沒理由,我只是不知道read()會返回整個文件。 – 2010-12-13 17:53:49

回答

2

您需要以二進制模式打開您的輸出文件,就像您輸入文件一樣。否則,換行符可能會改變。你可以看到,這是你的十六進制轉儲會發生什麼:0A字符('\n')改變爲OD 0A'\r\n')。

這應該工作:

input_file = open('f1', 'rb') 
contents = input_file.read() 

#.... 
data = contents[offset+8:size+offset] #for example 

output_file = open('f2', 'wb') 
output_file.write(data) 
+0

謝謝你,我改變了模式爲「ab」,它工作正常。非常感謝大家。 – 2010-12-13 18:36:57

+0

@day破解:如果你發現這個答案有幫助,你應該「接受」,方法是:單擊旁邊的綠色對勾正確的答案。 – 2010-12-13 19:04:31

0

你得到的結果「只是字節本身」。你可以寫()他們到一個打開的文件來複制它們。

「彷彿被添加了0D每當有0D 0A」

聽起來你使用的是Windows,並且您打開您的文件中的一個文本模式,而不是二進制。