バイナリファイルを眺めたり加工したりするTipsです。いろいろコマンドを 使っていますが、GNU textutils、GNU fileutils、GNU binutils の使用を前 提にしています。
16進数アドレス表記、バイトごとに16進数2桁表記、16バイトごとに改行、 ゼロ領域も表示するなら以下の通り。
% od -A x -t x1 -w 16 -v <file> | less
-w 16 はデフォルト値なので省略可能。
% strings -n 2 <file> | grep <string>
大きさ<size> * <count>のファイルを生成する。
% dd if=/dev/zero of=<file> bs=<size> count=<count>
普通にcatするだけ。
% cat <file1> <file2> > <newfile>
% head -c <n> <file> > <newfile>
% tail -c <n> <file> > <newfile>
% head -c <m> <file> | tail -c <m-n+1> > <newfile>
16進ダンプをとり、手動で編集し、バイナリに戻す。バイナリに戻すには スクリプトなどを用いる。以下は hexrestoreという逆変換perlスクリプ トを用いている。
% od -A x -t x1 -v orig.bin > dump.txt (dump.txtを編集する...) % hexrestore dump.txt > new.bin
全体を編集すると何かとつらいので、該当箇所だけを切り出して編集し、 あとでつないで復元する。
% head -c 100000 orig.bin > head.bin % tail -c 290000 orig.bin > tail.bin % head -c 110000 orig.bin | tail -c 10000 | od -A x -t x1 -v > middle.txt (middle.txtを編集する...) % hexrestore middle.txt > middle.bin % cat head.bin middle.bin tail.bin > new.bin % rm -f head.bin middle.bin tail.bin middle.txt
cmpコマンドを使用する。同一なら何も表示されない。
% cmp <file1> <file2>
2ファイル間の違いを可読文字列で表示する。
% od -A x -t x1 -w 1 -v <file1> > dump1 % od -A x -t x1 -w 1 -v <file2> > dump2 % diff -u dump1 dump2 | less