Я пытаюсь прочитать данные из файла в двоичном режиме и манипулировать этими данными.
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 "когда я просто хочу сами байты, чтобы записать их в новый файл.Есть ли простое решение этой проблемы, которое мне не хватает?
Вот пример шестнадцатеричного дампа с pdf, написанным моим python, и настоящим 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, а размер - размер копируемого фрагмента.