Как стать автором
Обновить

Комментарии 25

У меня одного вопрос: "А где описание сравнения JPEG?"
Обычный текст можно и обычным diff сравнить

Я текст выбрал для демонстрации чтоб наглядно было и не занимало много места. Но могу приложить и портянку с результатом сравнения JPEG файлов. Там собственно много пробелов и кусочки которые были побиты.

Можно просто заменить заголовок ставить)

Добавил в конце пример результата сравнения JPEG файлов.

Чот как-то сложно и не удобно…

Вариант 1: использовать утилиту cmp
$ cmp -l bad.png good.png | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
00003680 00 AF
00003681 00 EB
00003682 00 0B
00003683 00 9F

Вариант 2: vim
vimdiff bad.png good.png
# и в каждой панели выполнить :%!xxd

Похоже что cmp сравнивает линейно. У меня в файле пару байт добавилось в тех точках и cmp выведет весь хвост в с этого места.


Со вторым пытаюсь разобраться. Это для любителей vim наверное легче.

Да, именно с добавленными байтами, есть проблема…

На старте он конечно подсвечивает строки и места в них где произошли изменения. Это похоже на классический текстовый diff.


Я пытался. У меня пару раз завис терминал. После команды :%!xxd vim не даёт переключиться на другую панель командой :n. Я бросил это дело.

vimdiff это для небольших файлов (несколько десятков мегабайт, ну максимум сотня-другая), потом оно начинает ощутимо тормозить.
:n это не про переключение между split'ами

А как это делать?

CTRL-W + ←v^→
CTRL-W + hjkl

У меня получилось. Но это не вариант опять же. После команды :%!xxd файлы разбиваются на строки и после первого лишнего байта весь хвост файла становится красным.

hexdiff? Увидеть разницу между бинарниками достаточно.

Добавил в конце тестовые jpeg файлы и результат сравнения. Вы можете на них протестировать hexdiff. У меня его нет.

apt-get install hexdiff ;)
Два 16ричных dump'а, разница подсвечивается.

У меня Windows. Вопрос в том как разница подсвечивается. Если он подсветил большие участки файла то это не правильно. А если только те маленькие участки в несколько байт в которых разница то нормально.

После обработки картинок скриптами хостинга не вижу смысла их сравнивать.
ilkdrlzomd3jwpe3s_osj-vvpfw.jpeg — 17737 байт и zkhknvuzulrcqc92aocitt6sfeg.jpeg — 18829. Отличаются внутри чуть более чем полностью. Где взять tortoise.jpg и tortoise_bad.jpg — не понял, сорри.

Интересно что habr пережал только хороший файл а плохой не тронул. Перезалил на github и поменял ссылки в посте.

Спс, теперь похоже на правду.
18829 tortoise_bad.jpg
18821 tortoise.jpg
Первое отличие в позиции 0x147D

Только я все равно не понял, какая задача решалась ;)
Контроль целостности файлов?
Восстановление битого файла?
Исследование программы для обработки картинок (или протокола передачи), странно искажающей данные?

Я исследовал способ передачи бинарных данных в json кодируя в их utf8. Оказалось что файл бился в процессе декодирования из за того что я не учитывал суррогатные символы.


Вот с помощью этого способа я и увидел проблемные байты.

Понятно. google://json binary data говорит, что json это не умеет. И завернуть binary data в utf-8 строку это тоже надо сильно постараться.

Это не столь эфективно как Base64 но вполне возможно.

В произвольных двоичных данных могут оказаться символы, не существующие в utf-8. Превозмочь, конечно, возможно, но ведь есть и других готовых способов сериализации, кроме base64.

Это для меня просто головоломка. В процессе решения узнал как кодируется utf-8, какие символы допустимы в JSON. Так же узнал чем отличается escape() от encodeURIComponent().
Ну и результат: https://ivan386.github.io/tortoise/tortoise.html

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации