Vimでバイナリデータの表示
Vimでもバイナリファイルを開くことができるとは聞いていたが、やり方知らなかったのでメモ。
vimdoc(Google サイト)によると、まずファイルをバイナリモードで開く。
ファイルを開く時には -b オプション、後で設定する場合は、
:set binary
でバイナリモードになる。
ただ、これだとバイナリデータがテキスト表示されてるだけ。
よくあるバイナリエディタのように、16進数のダンプ表示にしたい場合は、
:%!xxd
とすれば、16進数のダンプ表示になる*1。
ちなみに上記指定だと2バイトごとにデータを区切って表示してくれます。
区切りを1バイトごとにしたい場合、
:%!xxd -g 1
とすればOK。
0000000: 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 .PNG........IHDR 0000010: 00 00 01 2c 00 00 01 2c 08 06 00 00 00 79 7d 8e ...,...,.....y}. 0000020: 75 00 00 24 90 49 44 41 54 78 da ed 9d 5f a8 24 u..$.IDATx..._.$ 0000030: c7 75 c6 5b 68 d7 5e 6d 9c 1d 29 bb 92 56 62 f1 .u.[h.^m..)..Vb. 0000040: 58 08 94 b5 8c 18 61 6d 2c 2b d8 6a cb 71 e4 25 X.....am,+.j.q.% 0000050: 52 18 27 7a f1 8b 19 e5 29 7a 08 8c 50 20 98 e0 R.'z....)z..P .. 0000060: 78 f0 43 02 01 c3 24 e4 21 c4 81 0c 04 12 12 08 x.C...$.!....... 0000070: 0c e4 c5 79 9b 27 bf 05 06 f2 07 42 08 0c 98 84 ...y.'.....B.... 0000080: 40 12 18 13 f2 90 40 a0 73 bf bb d3 37 7d fb 56 @.....@.s...7}.V 0000090: 55 57 55 57 77 d7 a9 fe 06 3e b0 b5 77 ef de db UWUWw....>..w... 00000a0: 55 f5 eb 53 a7 be 73 2a fb ce 2f dc 2b 28 8a a2 U..S..s*../.+(.. 00000b0: 24 28 e3 43 a0 28 8a c0 a2 28 8a 22 b0 28 8a 22 $(.C.(...(.".(." 00000c0: b0 28 8a a2 08 2c 8a a2 28 02 8b a2 28 02 8b a2 .(...,..(...(... 00000d0: 28 8a c0 a2 28 8a 22 b0 28 8a 22 b0 28 8a a2 08 (...(.".(.".(... 00000e0: 2c 8a a2 28 02 8b a2 28 02 8b a2 28 8a c0 a2 28 ,..(...(...(...( 00000f0: 8a 22 b0 28 8a 22 b0 28 8a a2 08 2c 8a a2 28 02 .".(.".(...,..(. 0000100: 8b a2 28 02 8b a2 28 8a c0 a2 28 8a 22 b0 28 8a ..(...(...(.".(. 0000110: 22 b0 28 8a a2 08 2c 8a a2 28 02 8b a2 28 02 8b ".(...,..(...(.. 0000120: a2 28 8a c0 a2 28 8a 22 b0 28 8a 22 b0 28 8a a2 .(...(.".(.".(.. 0000130: 08 2c 8a a2 08 2c 3e 04 8a a2 08 2c 8a a2 28 02 .,...,>....,..(.
こんな感じになる。私の場合、こっちの方が好みです。
で、このバイナリダンプ表示、ダンプデータ部分のコピーも可能。
ダンプデータをコピペする時とか地味に便利。
が、このダンプ部分を抜き出す正規表現をうまく書けなかった…。
上に示したものの場合、
:%s/[0-9a-f]\+: \(.*\) .*/\1/
とすれば一応できなくはない。
89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 2c 00 00 01 2c 08 06 00 00 00 79 7d 8e 75 00 00 24 90 49 44 41 54 78 da ed 9d 5f a8 24 c7 75 c6 5b 68 d7 5e 6d 9c 1d 29 bb 92 56 62 f1 58 08 94 b5 8c 18 61 6d 2c 2b d8 6a cb 71 e4 25 52 18 27 7a f1 8b 19 e5 29 7a 08 8c 50 20 98 e0 78 f0 43 02 01 c3 24 e4 21 c4 81 0c 04 12 12 08 0c e4 c5 79 9b 27 bf 05 06 f2 07 42 08 0c 98 84 40 12 18 13 f2 90 40 a0 73 bf bb d3 37 7d fb 56 55 57 55 57 77 d7 a9 fe 06 3e b0 b5 77 ef de db 55 f5 eb 53 a7 be 73 2a fb ce 2f dc 2b 28 8a a2 24 28 e3 43 a0 28 8a c0 a2 28 8a 22 b0 28 8a 22 b0 28 8a a2 08 2c 8a a2 28 02 8b a2 28 02 8b a2 28 8a c0 a2 28 8a 22 b0 28 8a 22 b0 28 8a a2 08 2c 8a a2 28 02 8b a2 28 02 8b a2 28 8a c0 a2 28 8a 22 b0 28 8a 22 b0 28 8a a2 08 2c 8a a2 28 02 8b a2 28 02 8b a2 28 8a c0 a2 28 8a 22 b0 28 8a 22 b0 28 8a a2 08 2c 8a a2 28 02 8b a2 28 02 8b a2 28 8a c0 a2 28 8a 22 b0 28 8a 22 b0 28 8a a2 08 2c 8a a2 08 2c 3e 04 8a a2 08 2c 8a a2 28 02
が、0x20(スペース)が2つ以上続くデータなどは上の正規表現ではうまくいかない。
勉強が足りませんね、はい。