使用vcdiff获取二进制文件之间的差异

tortoise.jpg tortoise_bad.jpg


我需要这样做,以便了解在传输过程中JPEG文件在哪里以及如何损坏。


VCDIFF-增量编码的格式和算法。 在RFC 3284中描述。

增量编码(Eng。Delta encoding) -一种以串行数据之间的差异(delta)形式而不是数据本身来表示数据的方式。

例如,为清楚起见,我使用Windows-1251中编码的文本文件。 但是,以同样的成功,它们可以是二进制文件。


资料来源:


"  " ( source.txt ) "  " ( target.txt ) 

您需要了解文件之间的区别:


 "  " ( source.txt -> target.txt ) "  " ( target.txt -> source.txt ) 

我使用xdelta3程序但我认为任何与vcdiff格式兼容的程序都可以。


如何获得


我们将需要另一个充满空格的文件:


 " " ( spaces.txt ) 

它的大小必须等于或等于源文件(source.txt)


团队:


 xdelta3 -e -A -n -s source.txt target.txt | xdelta3 -d -s spaces.txt 

结果:


   

使用的标志:
-e创建增量
-A删除多余的标题
-n删除crc(不允许将delta与其他源一起使用)
-s [] -与目标文件进行比较和还原的源
-d从增量和源获取目标文件


如何运作


如果运行命令:


 xdelta3 -e -A -n -s source.txt target.txt | xdelta3 printdelta 

在所有标题之后,我们将看到VCDIFF命令


  Offset Code Type1 Size1 @Addr1 + Type2 Size2 @Addr2 000000 025 CPY_0 9 S@0 000009 010 ADD 9 000018 025 CPY_0 9 S@14 

VCDIFF格式本质上非常简单。 它由3个团队组成。


COPY从源或目标复制数据
ADD (添加)-将增量中存储的数据写入目标文件(其唯一数据不在源中)
RUN (重复)-从增量重复一个字节指定次数


Delta仅存储唯一数据,并从源复制其余数据。 如果运行命令:


 xdelta3 -e -A -n -s source.txt target.txt > target.vcdiff 

我们将在增量中看到仅在目标文件中出现的单词“ changes”


 D0A6D093D094200102011720131B2009 0302190D0A19200E 

JSON不喜欢特殊字符,所以我将它们翻译成十六进制


如果将增量应用到源(source.txt)上,那么我们将获得目标文件(target.txt)


 xdelta3 -d -s source.txt target.vcdiff    

用充满空格的文件(spaces.txt)替换源(source.txt),我们用空格替换了源文件和目标文件中重复的数据。


 xdelta3 -d -s spaces.txt target.vcdiff  

您可以在spaces.txt文件中使用任何其他字符。 主要条件是spaces.txt文件的大小大于或等于源文件的大小。


实际上,我比较了JPEG文件,如下所示:


 xdelta3 -e -A -n -s bad_image.jpg good_image.jpg | xdelta3 -d -s spaces.txt 

比较这些文件的结果:


查看结果
  F488A2 F2AB 

许多空格和字节被“打”。 坏字节传输到十六进制。


测试可以测试比较方法的jpeg文件:


磁铁 tortoise.jpg (18821羽)磁铁 tortoise_bad.jpg (18 829羽)
tortoise.jpgtortoise_bad.jpg

 xdelta3 -e -A -n -s tortoise_bad.jpg tortoise.jpg | xdelta3 -d -s spaces.txt 

比较这些文件的结果:


查看结果
  F1BF F0B786 F39BAF F3BD94 

坏字节传输到十六进制。

Source: https://habr.com/ru/post/zh-CN419883/


All Articles