在二进制分隔符上拆分二进制文件?

时间:2010-09-06 15:10:07

标签: bash unix shell binary grep

我正在研究一个shell脚本,将MPO立体3D图像转换为标准JPEG图像。 MPO文件只是两个JPEG图像,连接在一起。

因此,您可以通过查找第二个JPEG幻数标题(0xFFD8FFE1)的字节偏移来拆分JPEG文件。我已经使用hexdump / xxd,grep,head和tail手动完成了这个。

这里的问题是grep:我可以使用什么来直接搜索二进制文件以获取特定的幻数,并获取字节偏移量?或者我不应该使用shell脚本吗?感谢。

5 个答案:

答案 0 :(得分:7)

您可以使用bbe(http://bbe-.sourceforge.net/)执行此操作,这是一个类似二进制文件的程序:

为了提取第一个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文件的其他位置,则无法使用此功能。

答案 1 :(得分:3)

我认为巴特是您最大的问题。如果在此过程中重复使用二进制序列,您将获得部分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

这对我来说似乎没问题,但上面提到的问题仍然没有处理,而且非常真实。

答案 2 :(得分:0)

我认为一个非常简单的家酿方法将是您最好的选择。执行此操作的代码非常小,具体取决于二进制文件格式的所有特殊情况。

  1. 使用mmap在内存中方便地查看文件。
  2. 开始扫描,并将字节偏移量保存在变量中,例如start
  3. 扫描直至到达分隔符,保存结束偏移量,例如end
  4. 创建新文件
  5. 内存映射新文件
  6. 将字节范围从start复制到end到新文件中。
  7. 关闭新文件并重新开始扫描。

答案 3 :(得分:0)

FFE1不是某些jpeg“幻数”的一部分,它是APP1标记。而且不能保证在SOI标记FFD8之后。此外,您应该小心一些jpeg图像将缩略图jpeg嵌入EXIF块中。这很可能也包含APP1标记。

答案 4 :(得分:0)

我在http://www.davidglover.org/2010/09/using-the-fuji-finepix-real-3d-w3-camera-on-a-mac-or-linuxunix.html找到了更好的MPO文件结构解释(以及如何正确处理)