Понадобилось мне это для того чтобы понять в каком месте и как файл 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 файлы на которых вы можете протестировать способы сравнения:
![]() |
![]() |
xdelta3 -e -A -n -s tortoise_bad.jpg tortoise.jpg | xdelta3 -d -s spaces.txtРезультат сравнения этих файлов:
F1BF F0B786 F39BAF F3BD94 Битые байты перевёл в HEX.


