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つ以上続くデータなどは上の正規表現ではうまくいかない。
勉強が足りませんね、はい。

*1:ちなみにgvimのメニューからも辿れます。ツール(T)→HEXへ変換(C)より。