我想從二進制模式的文件讀取數據並操作該數據。讀取和寫入動態大小的二進制數據問題
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數據的開始,大小是要複製的塊的大小。
你可以叫'resultfile.read()'讀取整個文件。 – 2010-12-13 17:48:04
'resultfile.read()'將以字符串的形式返回文件的全部內容。你有沒有理由首先抓住尺碼? – nmichaels 2010-12-13 17:49:53
沒理由,我只是不知道read()會返回整個文件。 – 2010-12-13 17:53:49