新井です。

以下のような16進ダンプの方法を考えてました。

 00000000  61626364 65666768 696a6b6c 6d6e6f70  abcdefghijklmnop
 00000010  61626364 65666768 696a6b6c 6d6e6f70  abcdefghijklmnop

最初、必要にせまられて作ったのですがせっかくなので FAQ にで
も入れようかと思いました。で、より良いものがないかみなさんの
お知恵を拝借しようと思った次第です。

要件としては、短く、エレガントに最低限の機能を持ったものです。
添付のものは自分ではなかなか満足の行くものができたと思ってい
るのですが、

・同じ行の出力は省略したい
・日本語出力に対応したい

というのがあります。これを入れるとコードがぐちゃぐちゃになっ
てしまうので、エレガントさ(というかわかりやすさ)がなくなるよ
うならこのレベルで載せちゃおうかなとも思ってます。

なお、16進ダンプのための既存のライブラリの紹介も歓迎します。
FAQ に載せますので。


def hexdump(str) offset = 0 result = [] while raw = str.slice(offset, 16) and raw.length > 0 # address field line = sprintf("%08x ", offset) # data field for v in raw.unpack('N* a*') if v.kind_of? Integer line << sprintf("%08x ", v) else v.each_byte {|c| line << sprintf("%02x", c) } end end # text field line << ' ' * (47 - line.length) line << raw.tr("\000-\037\177-\377", ".") result << line offset += 16 end result end puts "--", hexdump "" puts "--", hexdump "a" puts "--", hexdump "abcd" puts "--", hexdump "abcdefghijklmnop" puts "--", hexdump "abcdefghijklmnop" "q" puts "--", hexdump "abcdefghijklmnop" "qrstu" puts "--", hexdump "abcdefghijklmnop" "qrstu" "v" puts "--", hexdump "abcdefghijklmnop" * 4 puts "--", hexdump "abcdefghijklmnoあ" * 4
結果 -- -- 00000000 61 a -- 00000000 61626364 abcd -- 00000000 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop -- 00000000 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop 00000010 71 q -- 00000000 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop 00000010 71727374 75 qrstu -- 00000000 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop 00000010 71727374 7576 qrstuv -- 00000000 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop 00000010 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop 00000020 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop 00000030 61626364 65666768 696a6b6c 6d6e6f70 abcdefghijklmnop -- 00000000 61626364 65666768 696a6b6c 6d6e6fa4 abcdefghijklmno. 00000010 a2616263 64656667 68696a6b 6c6d6e6f .abcdefghijklmno 00000020 a4a26162 63646566 6768696a 6b6c6d6e ..abcdefghijklmn 00000030 6fa4a261 62636465 66676869 6a6b6c6d o..abcdefghijklm 00000040 6e6fa4a2 no.. -- 新井康司 (Koji Arai)