Разбить двоичный файл на двоичный разделитель? - PullRequest
1 голос
/ 06 сентября 2010

Я работаю над сценарием оболочки для преобразования стереографических 3D-изображений MPO в стандартные изображения JPEG. Файл MPO - это всего лишь два JPEG-изображения, соединенных вместе.

Таким образом, вы можете разделить файлы JPEG, найдя смещение в байтах заголовка второго магического числа JPEG (0xFFD8FFE1). Я сделал это вручную, используя hexdump / xxd, grep, head и tail.

Проблема здесь в grep: что я могу использовать для непосредственного поиска в двоичном файле определенного магического числа и получения смещения в байтах? Или я не должен использовать сценарий оболочки для этого вообще? Спасибо.

Ответы [ 5 ]

7 голосов
/ 06 сентября 2010

Вы можете сделать это, используя bbe (http://bbe -. Sourceforge.net/), которая является программой, подобной sed для двоичных файлов:

Для извлечения первого использования JPEG:

bbe -b '/\xFF\xD8\xFF\xE1/:' -e 'D 2' -o first_jpeg mpo_file

И для второго:

bbe -b '/\xFF\xD8\xFF\xE1/:' -e 'D 1' -o second_jpeg mpo_file

Обратите внимание, что это не будет работать, если магическое число JPEG встречается где-то еще в файле MPO.

3 голосов
/ 07 сентября 2010

Я думаю, что Барт сталкивается с вашей самой большой проблемой. Если эта двоичная последовательность повторяется во время процесса, вы получите частичные JPEG.

Я провел быструю проверку, объединив несколько JPEG-файлов, а затем распаковав их с помощью awk (обратите внимание, что магическое число в моих файлах заканчивалось 0xE0, а не 0xE1):

   # for i in *.jpg ; do cat $i ; done > test.mpo 
   # awk 'BEGIN {RS="\xFF\xD8\xFF\xE0"; FILENUM=-1} {FILENUM++; if (FILENUM == 0) {next}; FILENAME="image0"FILENUM".jpg"; printf "%s",RS$0 > FILENAME;}' test.mpo  
   # file image0*.jpg
    image01.jpg:  JPEG image data, JFIF standard 1.01
    image010.jpg: JPEG image data, JFIF standard 1.01
    image011.jpg: JPEG image data, JFIF standard 1.01

Мне показалось, что это нормально, но вышеупомянутые проблемы все еще не решены и вполне реальны.

0 голосов
/ 01 февраля 2011

Я нашел гораздо лучшее объяснение файловой структуры MPO (и как правильно ее обрабатывать) на http://www.davidglover.org/2010/09/using-the-fuji-finepix-real-3d-w3-camera-on-a-mac-or-linuxunix.html

0 голосов
/ 06 декабря 2010

FFE1 не является частью некоторого jpeg "магического числа", это маркер APP1. И не гарантируется, что он придет сразу после маркера SOI FFD8. Кроме того, вы должны быть осторожны, чтобы некоторые jpeg-изображения встраивали миниатюру jpeg в блок EXIF. Скорее всего, он также будет содержать маркер APP1.

0 голосов
/ 06 сентября 2010

Я думаю, что лучшим выбором будет очень простой подход к домашнему пиву.Код для этого будет очень маленьким, в зависимости от всех особых случаев вашего двоичного формата файла.

  1. Используйте mmap, чтобы получить удобный просмотр вашего файла в памяти.
  2. Запустите сканирование и сохраните байтовое смещение в переменной, скажем start.
  3. Сканирование до достижения разделителя, сохраняя конечное смещение, скажем, end.
  4. Создайте новый файл
  5. Карта памяти нового файла
  6. Скопируйте диапазон байтов из start в end в новый файл.
  7. Закройте новый файли начните сканирование снова.
...