ddコマンドのまとめです。
各項目の入力データは以下のようにして作成。
takk@deb9:~/tmp$ seq 64 | perl -ne'print chr'>in.bin takk@deb9:~/tmp$ od -td1 -w8 -An -v in.bin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 takk@deb9:~/tmp$
Contents
バイナリデータの最初から最後までコピー
takk@deb9:~/tmp$ dd < in.bin > out.bin 0+1 レコード入力 0+1 レコード出力 64 bytes copied, 0.000332896 s, 192 kB/s takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 takk@deb9:~/tmp$
最初から最後までなら、cpで済むのでこの使い方自体は意味がないです。ddによるフィルタリングパターンとして挙げています。
バイナリデータの最初から途中までコピー
takk@deb9:~/tmp$ dd bs=1 count=38 < in.bin > out.bin 38+0 レコード入力 38+0 レコード出力 38 bytes copied, 0.0008758 s, 43.4 kB/s takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 takk@deb9:~/tmp$
各種フォーマットのヘッダ部分の抽出とかに使えるでしょうか。
バイナリデータの途中から最後までコピー
takk@deb9:~/tmp$ dd bs=1 skip=3 < in.bin > out.bin 61+0 レコード入力 61+0 レコード出力 61 bytes copied, 0.00042046 s, 145 kB/s takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 takk@deb9:~/tmp$
使い道はやはり、各種フォーマットのボディ部分の抽出とか、ですかね。
バイナリデータの途中の一部分をコピー
takk@deb9:~/tmp$ dd bs=1 skip=3 count=6 < in.bin > out.bin 6+0 レコード入力 6+0 レコード出力 6 bytes copied, 0.000562645 s, 10.7 kB/s takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin 4 5 6 7 8 9 takk@deb9:~/tmp$
バイナリデータ内のある数値を抜き出ししたいときに有用です。抜き出したバイナリはテキストに変換して使いますので、結局ddはxxd等のコマンドと併用することになると思います。
バイナリデータの上下1Byte入れ替え
takk@deb9:~/tmp$ dd conv=swab < in.bin > out.bin 0+1 レコード入力 0+1 レコード出力 64 bytes copied, 0.00062047 s, 103 kB/s takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin 2 1 4 3 6 5 8 7 10 9 12 11 14 13 16 15 18 17 20 19 22 21 24 23 26 25 28 27 30 29 32 31 34 33 36 35 38 37 40 39 42 41 44 43 46 45 48 47 50 49 52 51 54 53 56 55 58 57 60 59 62 61 64 63 takk@deb9:~/tmp$ ^C
16bitのデータの上下8bitを入れ替えするとき、つまりエンディアン変換したいときに使いますが、今時、16bitでは足らないでしょう。このオプション単体で使うことはないのかもしれません。
バイナリデータの生成(ゼロ)
takk@deb9:~/tmp$ dd bs=1 count=64 < /dev/zero > out.bin 64+0 レコード入力 64+0 レコード出力 64 bytes copied, 0.000629518 s, 102 kB/s takk@deb9:~/tmp$ takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 takk@deb9:~/tmp$
よく使うパターンだと思います。
バイナリデータの生成(乱数)
takk@deb9:~/tmp$ dd bs=1 count=64 < /dev/urandom > out.bin 64+0 レコード入力 64+0 レコード出力 64 bytes copied, 0.000635843 s, 101 kB/s takk@deb9:~/tmp$ od -tu1 -w8 -An -v out.bin 185 76 144 72 205 90 140 208 135 216 177 209 33 60 41 152 66 227 246 122 114 86 207 135 210 67 130 83 173 63 180 198 14 7 69 214 89 97 128 157 146 60 66 12 142 182 55 27 227 166 42 199 170 93 38 7 173 242 31 40 225 38 166 162 takk@deb9:~/tmp$
暗号等に使うときに有用でしょうか。
バイナリデータの一部を、入力ファイルに基づいて書き換え
takk@deb9:~/tmp$ seq 64 | perl -ne 'print chr 8' > out.bin takk@deb9:~/tmp$ dd bs=1 count=3 skip=26 seek=10 if=in.bin of=out.bin conv=notrunc 3+0 レコード入力 3+0 レコード出力 3 bytes copied, 0.000978647 s, 3.1 kB/s takk@deb9:~/tmp$ od -td1 -w8 -An -v out.bin 8 8 8 8 8 8 8 8 8 8 27 28 29 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 takk@deb9:~/tmp$
テストに使うデータとか、バイナリデータをある数値で初期化したい場合等、たぶん、これが一番使えるかもしれません。
バイナリデータの一部を、手入力で書き換え
takk@deb9:~/tmp$ seq 64 | perl -ne 'print chr 0x2d' > out.bin takk@deb9:~/tmp$ dd bs=1 count=3 seek=10 conv=notrunc of=out.bin abc 3+0 レコード入力 3+0 レコード出力 3 bytes copied, 1.44266 s, 0.0 kB/s takk@deb9:~/tmp$ takk@deb9:~/tmp$ od -tc -w8 -An -v out.bin - - - - - - - - - - a b c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - takk@deb9:~/tmp$
手入力でバイナリデータを書き換えることは、ミスもあるのであまりやらない方がよいのですが、このバイナリ操作がとても面白いです。ASCIIコードと数値を暗記して、いつでもどこでもバイナリ加工でできるようになると、もうddの虜になってしまいます。
コメント