Я должен сравнить два двоичных файла и получить вывод в форме:
<fileoffset-шестнадцатеричный> <file1-byte-hex>-<file2-byte-hex>
для каждого различного байта. Итак, если file1.bin
00 90 00 11
в двоичной форме и file2.bin
00 91 00 10
Я хочу получить что-то как
00000001 90 91
00000003 11 10
Существует ли способ сделать это в Linux? Я знаю о cmp -l
но это использует десятичную систему счисления для смещений и восьмеричный для байтов, которых я хотел бы избежать.
Это распечатает смещение и байты в шестнадцатеричном числе:
cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1, strtonum(0$2), strtonum(0$3)}'
Или сделайте $1-1
чтобы иметь первое печатное смещение запускаются в 0.
cmp -l file1.bin file2.bin | gawk '{printf "%08X %02X %02X\n", $1-1, strtonum(0$2), strtonum(0$3)}'
К сожалению, strtonum()
характерно для ПРОСТОФИЛИ, таким образом, для других версий awk — например, mawk — необходимо будет использовать восьмеричную к десятичному числу функцию преобразования. Например,
cmp -l file1.bin file2.bin | mawk 'function oct2dec(oct, dec) {for (i = 1; i <= length(oct); i++) {dec *= 8; dec += substr(oct, i, 1)}; return dec} {printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)}'
Вспыхнувший для удобочитаемости:
cmp -l file1.bin file2.bin |
mawk 'function oct2dec(oct, dec) {
for (i = 1; i <= length(oct); i++) {
dec *= 8;
dec += substr(oct, i, 1)
};
return dec
}
{
printf "%08X %02X %02X\n", $1, oct2dec($2), oct2dec($3)
}'
Существует инструмент под названием DHEX, который может сделать задание, и существует другой инструмент под названием VBinDiff.
Для подхода строго командной строки попробуйте jojodiff.