GNU/Linux >> Linux の 問題 >  >> Linux

Linux でバイナリ ファイルを比較するにはどうすればよいですか?

これにより、オフセットとバイトが 16 進数で出力されます:

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() は GAWK に固有であるため、他のバージョンの awk (mawk など) では、8 進数から 10 進数への変換関数を使用する必要があります。たとえば、

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)
          }'

As ~Quack 指摘:

 % xxd b1 > b1.hex
 % xxd b2 > b2.hex

そして

 % diff b1.hex b2.hex

または

 % vimdiff b1.hex b2.hex

diff + xxd

diff を試す 次の zsh/bash プロセス置換の組み合わせ:

diff -y <(xxd foo1.bin) <(xxd foo2.bin)

場所:

  • -y 違いを並べて表示します (オプション)。
  • xxd バイナリ ファイルの 16 進ダンプ出力を作成する CLI ツールです。
  • -W200 を追加 diffまで より広い出力用 (1 行あたり 200 文字)。
  • 色には、colordiff を使用します 以下に示すとおりです。

colordiff + xxd

colordiff の場合 、 diff に色付けできます 出力例:

colordiff -y <(xxd foo1.bin) <(xxd foo2.bin)

出力例:

vimdiff + xxd

vimdiff も使用できます 、例

vimdiff <(xxd foo1.bin) <(xxd foo2.bin)

ヒント:

  • ファイルが大きすぎる場合は、制限を追加します (例:-l1000 ) xxd ごとに

Linux
  1. Linuxでバイナリファイルを分析する10の方法

  2. Linuxでgocryptfsを使用してファイルを暗号化する方法

  3. diff3ツールを使用してLinuxで3つのファイルを比較する方法

  1. Linuxでファイルの名前を変更する方法

  2. Linuxで複数のファイルを圧縮する方法

  3. Linuxでテキストファイルからバイナリを見分ける方法

  1. Linuxのウィンドウ装飾をカスタマイズする方法

  2. Linuxでファイルを見つける方法

  3. Linux で同じサイズの 2 つのファイルのバイナリ diff を実行するにはどうすればよいですか?