diff - найти конкретное изменение между двумя значениями в шестнадцатеричном дампе

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

Затем я создаю второй двоичный дамп и сравниваю два файла в vim, используя xxd, чтобы создать двоично-текстовые представления исходных данных.

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

Можно ли указать diff или vimdiff сказать, сравнить два файла и показать мне только те части файла, где в исходном файле (т.е. в файле 1) значение было установлено на 1, а во втором файле значение был установлен на 32?

Благодарю вас!


person Cloud    schedule 05.05.2013    source источник


Ответы (1)


Я использую:

diff <(xxd file1.bin) <(xxd file2.bin)

При этом используется подстановка процессов для сравнения результатов двух xxd процессов. Обратите внимание, что это по-прежнему показывает различия строк, поэтому, если какой-либо байт в строке отличается, он будет указан. Это дает хорошее сравнение, выглядящее как hexdump.

Однако классический инструмент для этого — cmp.

Таким образом, это может быть обработано так:

cmp -l file1.raw file2.raw | grep -in "oldValue" | grep -in "newValue"

В нем будет указано именно то, что вам нужно, со следующими распечатанными полями:

OFFSET  VALUE_IN_FILE_1 VALUE_IN_FILE_2
person Jonathon Reinhart    schedule 05.05.2013
comment
Это предлагает сравнение в текстовом режиме вывода двух двоичных файлов в текст, которые я уже генерирую в vim. Как это решает проблему сравнения полей, учитывая, что я знаю, что одно поле будет начинаться со значения x, а во втором файле будет значение y? - person Cloud; 05.05.2013
comment
Я не понимаю проблемы. cmp -l будет печатать номер байта (десятичный) и различающиеся значения байтов (восьмеричный) для каждой разницы. Просто grep просмотрите этот список для известных значений, и он даст вам десятичное смещение. - person Jonathon Reinhart; 09.05.2013
comment
Теперь я понимаю, что вы имели в виду. Спасибо за терпеливость! - person Cloud; 09.05.2013
comment
небольшая вариация может быть: vim -d ‹(xxd файлA) ‹(xxd файлB) - person J Jorgenson; 13.01.2014