Pull to refresh

Получаем разницу между бинарными файлами при помощи vcdiff

Reading time2 min
Views6.2K

tortoise.jpg tortoise_bad.jpg


Понадобилось мне это для того чтобы понять в каком месте и как файл JPEG испорчен в процессе передачи.


VCDIFF — формат и алгоритм для дельта кодирования. Описан в RFC 3284.

Дельта-кодирование (англ. Delta encoding) — способ представления данных в виде разницы (дельты) между последовательными данными вместо самих данных.

Для примера я использую текстовые файлы в кодировке 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 (он не даёт применить дельту с другим источником)
-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 (повторить) — повторяет один байт из дельты заданное количество раз


Дельта хранит только уникальные данные а остальное копирует из источника. Если выполнть команду:


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

Мы увидим в дельте только слово "изменения" которое есть только в целевом файле


D0A6D093D094200102011720131B2009
0302изменения190D0A19200E

(JSON не любит спец символы поэтому я перевёл их в HEX)


Если дельту применить на источнике (source.txt) то мы получим целевой файл (target.txt)


xdelta3 -d -s source.txt target.vcdiff
копия    изменения    копия

Подменив источник (source.txt) на файл заполненный пробелами (spaces.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                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            

Много пробелов и байты которые были "побиты". Битые байты перевёл в HEX.


Тестовые jpeg файлы на которых вы можете протестировать способы сравнения:


magnettortoise.jpg (18 821 b) magnettortoise_bad.jpg (18 829 b)
tortoise.jpg tortoise_bad.jpg

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

Результат сравнения этих файлов:


Посмотреть результат
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             F1BF                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     F0B786                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          F39BAF                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     F3BD94                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         

Битые байты перевёл в HEX.

Tags:
Hubs:
Total votes 14: ↑12 and ↓2+10
Comments25

Articles