Чтение и запись двоичных данных вопроса динамических размеров - PullRequest
0 голосов
/ 13 декабря 2010

Я пытаюсь прочитать данные из файла в двоичном режиме и манипулировать этими данными.

 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, а размер - размер копируемого фрагмента.

Ответы [ 2 ]

2 голосов
/ 13 декабря 2010

Вам нужно открыть ваш выходной файл в двоичном режиме, как вы делаете свой входной файл. В противном случае символы новой строки могут быть изменены. Вы можете видеть, что это происходит в вашем шестнадцатеричном дампе: 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 голосов
/ 13 декабря 2010

Результат, который вы получите , равен"только сами байты". Вы можете написать () их в открытый файл, чтобы скопировать их.

"Кажется, что 0D добавляется всякий раз, когда есть 0D 0A"

Звучит так, будто вы находитесь в Windows, и вы открываете один из ваших файлов в текстовом режиме вместо двоичного.

...