Двоичный инструмент сравнения для очень больших файлов?

Мне нужна утилита для сравнения двух двоичных файлов. Файлы большие (6-50 ГБ).

Примечание. Здесь нужно особо указать: большинство программ diff работают, отображая файл в свое виртуальное адресное пространство. В 32-битной Windows это ограничивает размеры файлов, которые можно сравнить до 1 ГБ каждый. (1,5 ГБ, если Windows запускается с параметром /3GB, и программа объявила, что поддерживает 3 ГБ; /LARGEADDRESSAWARE). Если программа настаивает на том, чтобы файл полностью отображался в его адресное пространство, его необходимо перекомпилировать как 64-разрядное приложение с адресным пространством 8 ТБ (что соответствует моим требованиям).

Beyond Compare - мой любимый инструмент сравнения, и я им владею, но он не может обрабатывать двоичные файлы поверх того, что может поместиться в адресном пространстве процесса.

HexDiff 3.0 показался интересным, за исключением того, что пробная версия не поддерживает различия.

  • инструмент должен быть бесплатным, так как я не плачу денег, чтобы понять, что он не работает.

  • инструмент должен быть приложением Windows.

  • инструмент не должен быть консольным (то есть приложением Windows)

  • инструмент должен быть графическим (то есть приложением Windows)

13 ответов

Решение

Вы ищете HxD лучший и бесплатный Hex-редактор для Windows, никаких изменений не требуется с 3 апреля 2009 года, так как он не содержит ошибок, просто идеален.

Его "Сравнение файлов (просто)" (Ctrl+K) делает его визуальным для любых двоичных файлов.

  • Мгновенное открытие независимо от размера файла (до 8EB) 8 ExaByte - это 8 миллионов TeraByte.

((bsdiff в высшей степени элитный:), кроме этого)

Мне лично нравится vbindiff (режим SUA) для небольших файлов, и я провел бета-тестирование этого инструментального блок-чата (Windows WPF, бесплатный клиент, стоимость сетевого фида), который может очень быстро выполнять поиск по подразделам в больших пространствах поиска контента, если скоро выйдет.

Если вы используете нативные (собственные) исполняемые файлы, PatchDiff2 (инструмент бесплатный, IDA стоит $) - это плагин IDA, который обеспечит вам точность более 90-95%, даже с вариациями в оптимизации или других настройках сборки.

BinNavi, ($) - еще один инструмент, который хорошо работает.

Если вы хотите оценить сходство двоичных файлов, STAN (работает в режиме SUA) может быстро пробиться через пресловутую BS, чтобы получить безопасную ставку.

Для полноты картины, bsdiff - это новый алгоритм Google для их браузера Chrome. Кажется, что Courgette значительно улучшил bsdiff, было бы неплохо увидеть, насколько хорошо он может быть адаптирован к другим форматам, и, кажется, он сильно использует оптимизированный поиск в таблице символов и то, что кажется (не читало код) улучшением, которое вы получили бы от использования основанных указателей (т.е. не используя линейные адреса, а просто используя смещение в максимально совместимой нотации).

Google использовал bsdiff, http://www.daemonology.net/bsdiff/

Но теперь они используют Courgette http://dev.chromium.org/developers/design-documents/software-updates-courgette

Традиционный способ сделать это с помощью "cmp --verbose" (что эквивалентно "cmp -l"). Добавьте флаг "--print-bytes" (или "-b"), чтобы визуализировать различные байты в читаемом формате (в дополнение к десятичным значениям и номерам байтов, предоставляемым флагом "--verbose"). Поскольку ваши файлы настолько велики, вы, вероятно, захотите объединить вывод в файл, чтобы вы могли смотреть его и иметь результаты для анализа на досуге. Например, я сравню два похожих файла MP3:

$ cmp --verbose --print-bytes a.mp3 b.mp3 | tee differences
   16315 302 M-B  115 M
   16316 233 M-^[ 144 d
   16317 110 H    224 M-^T

,,,,

21601545 377 M-^? 300 M-@
21601546 203 M-^C   0 ^@
21601547 300 M-@    0 ^@

(Конечно, указывайте имена файлов соответствующим образом; cmp понимает флаг "-", если вам это нужно. Вы можете ввести "cmp -lb" вместо длинных аргументов.) Используйте wc, чтобы увидеть, сколько байтов различается:

$ wc --lines differences 
66115 differences
$ wc --bytes a.mp3 b.mp3
21602502 a.mp3
21602502 b.mp3
43205004 total

cmp сравнивает файлы побайтово (повторная синхронизация невозможна, если байты вставлены или удалены), но это именно то, что вам нужно. Он может обрабатывать произвольно большие файлы (и не требует больше памяти, чем для маленьких файлов). По умолчанию он встречается в Mac OS X, различных BSD и Unices, а также в GNU/Linux, т. Е. В каждой широко используемой современной ОС, кроме Windows. (Рассмотрим минимальную установку Cygwin или эквивалентную, если это действительно ограничение.)

Хотя это и кажется правильным инструментом для работы, его исключают по двум вашим критериям: он "консольный" и не имеет графических компонентов. Я думаю, что-то не хватает в описании вашей проблемы. Можете ли вы объяснить, почему консоль будет проблематичной, и какие дополнительные данные вам нужно визуализировать?

Вы можете попробовать xdelta. Я никогда не искал версию с графическим интерфейсом, но вы можете попробовать эту версию (хотя, похоже, это только KDE).

Я с удовольствием использую WinMerge, чтобы показать различия в двоичных файлах. Это бесплатно с открытым исходным кодом тоже.

В противном случае ваши файлы будут очень большими и могут не уместиться в инструменте сравнения. Рассматривали ли вы создание бинарного патча (например,.ppf, Playstation Patch File) и просто посмотрите на него?

Я работаю в ECMerge, если вы ищете инструмент дифференцирования, а не "дельту", то есть понимание различия важнее, чем компактное представление, оно делает то, что вы хотите. Размер файла практически не ограничен (около ста в терабайтах), только количество учитывается для предотвращения патологических различий (например, миллиарды различий).

Ваши последние три требования делают это сложной проблемой. Что может предложить графическая программа для Windows, чего не может текстовая консольная программа? Так что не так много инструментов, которые делают то, что вы хотите. Поэтому я проигнорирую последние три, возьму мою карму в свои руки и предложу rdiff. Это текст и консоль. Но он может различать двоичные файлы произвольного размера. Вы можете получить rdiff для Windows через Cygwin ( http://cygwin.com/).

Я столкнулся с этим в поисках рекурсивного инструмента сравнения двоичных файлов лучше, чем те, которые я уже использую.

Я знаю один, который может соответствовать вашим требованиям. Единственный способ потерпеть неудачу - это размер файла, но оно того стоит. Он называется Windiff и поставляется с различными версиями инструментов Windows/ пакетов расширения / как бы они ни назывались. Я обнаружил, что это работает довольно хорошо.

Вы можете попробовать hexdiff, если он компилируется в Windows. Он основан на консоли, но имеет графический вывод, и я видел разницу между двумя 5 ГБ файлами без проблем

Вы можете попробовать vbindiff, http://www.cjmweb.net/vbindiff/

Это консольное приложение, однако оно очень хорошо сделано, поэтому я считаю его графическим - вы получите разделенный экран, который показывает два файла рядом в шестнадцатеричном формате.

он предназначен для обработки больших файлов, сейчас я просматриваю 2 8ГБ файлов.

Это еще одна рекомендация для HxD http://mh-nexus.de/en/hxd/ - я просто использовал его для сравнения двух файлов MXF размером 3 ГБ, чтобы проверить, где происходило повреждение рендеринга кадра. Операция заняла около 10 секунд, в то время как Araxis Merge (мой традиционный и очень любимый diff-инструмент) смог использовать всю память на машине и все еще не работал для этой операции.

Поскольку файлы настолько огромны, и у вас, вероятно, есть несколько различий, разница будет слишком большой, чтобы вписаться во все стандартные приложения Windows. Так что мой подход будет следующим:

  • Преобразуйте файлы в текст. Используйте шестнадцатеричный дампер командной строки или, что еще более полезно, напишите небольшую программу, которая понимает, что означают двоичные данные, чтобы вы могли сравнивать значимые данные вместо битовых отходов.

  • Используйте инструмент командной строки diff (например, один из Cygwin). Инструменты командной строки GNU могут обрабатывать произвольно большие файлы.

  • Проверьте результат с less, Вы можете утверждать, что вам захочется увидеть все различия, но если вы не инопланетянин в человеческом обличье, ваш мозг не сможет даже удержать содержимое целого экрана, заполненного текстом, в своей рабочей памяти. Поэтому, если вы действительно хотите чего-то достичь, вы должны уменьшить объем данных, которые вам нужны.

Другие вопросы по тегам