From: TEI meiki Date: 1998-06-17T21:47:01+09:00 Subject: [ruby-list:8395] hd.rb 1.8 patch こんにちは、鄭です。 仕事柄、big-endianと little-endian の世界をいったり来たりする事が 多いのですが、little-endianのデータファイルの hex dump を big-endian のマシンで見たい、、、といった場面が最近とみにおおくて、 ついに big/little両用の hex dump ツールが欲しくなり、 WATANABE さんの、hd.rb (1.8) を改造してみました。 スクリプト言語で書いてあるとこういう時に楽ですね。 しかも ruby は触っていて楽しいし。(^_^) # unpack('N4') ってことは、WATANABEさんは、big-endian の世界の人なのかしら :-) --- hd.rb.org18 Wed Jun 17 21:35:13 1998 +++ hd.rb Tue Jun 16 09:06:23 1998 @@ -14,6 +14,12 @@ -[0-9]+ offset -0[0-7]+ octal -0x[0-9a-fA-F]+ hex + -byte byte size dump + -short short word size dump + -long long word size dump + -big big-endian dump + -little little-endian dump + -native native-endian dump -s sjis/input code -e euc /input code -S sjis/output code @@ -22,31 +28,50 @@ exit 1 end +$endian = :native +$datasize = 4 + +Dumpformat = { + 4 => "%08x %08x %08x %08x %08x ", + 2 => "%08x "+"%04x %04x %04x %04x "*2, + 1 => "%08x "+"%02x %02x %02x %02x "*4 +} + +Unpackformat = { + 4 => { :native => "L", :big => "N", :little => "V" }, + 2 => { :native => "S", :big => "n", :little => "v" }, + 1 => { :native => "C", :big => "C", :little => "C" }, +} + def hd(f, offset) + unpackformat = Unpackformat[$datasize][$endian] + dumpformat = Dumpformat[$datasize] f.pos = offset if offset > 0 and f != STDIN while $_ = f.read(16) and $_.length == 16 - bin = $_.unpack('N4') + bin = $_.unpack(unpackformat+"*") - printf("%8.8x %8.8x %8.8x %8.8x %8.8x", offset, *bin); - print ' ', $_.tr("\000-\037\177", '.').bin_to_str, "\n"; + printf(dumpformat, offset, *bin); + print $_.tr("\000-\037\177", '.').bin_to_str, "\n"; offset += 16 end if $_ and $_.length > 0 - bin = $_.unpack('C*') - - bin.each_index { |i| - bin[i] = sprintf('%2.2x', bin[i]) - } - - for i in bin.length .. 16 - 1 - bin.push(' ') + printf("%08x ", offset); + leftbins = $_ + lastline = "" + datasize = $datasize + + while leftbins and leftbins.length > 0 + while leftbins.length < datasize + datasize /= 2 end - - printf("%8.8x %s%s%s%s %s%s%s%s %s%s%s%s %s%s%s%s", offset, *bin); - print ' ', $_.tr("\000-\037\177", '.').bin_to_str, "\n"; + bin, leftbins = leftbins.unpack(Unpackformat[datasize][$endian]+"a*") + lastline += sprintf("%0#{datasize*2}x", bin) + " " + end + print lastline, " "*([0,52,42,0,37][$datasize]-lastline.length) + print $_.tr("\000-\037\177", '.').bin_to_str, "\n"; end end @@ -73,7 +98,19 @@ while $_ = ARGV[0] and /^-/ ARGV.shift - if /[se]/i + if $_ == "-byte" + $datasize = 1 + elsif $_ == "-short" + $datasize = 2 + elsif $_ == "-long" + $datasize = 4 + elsif $_ == "-big" + $endian = :big + elsif $_ == "-little" + $endian = :little + elsif $_ == "-native" + $endian = :native + elsif /[se]/i $in_kanji_code = if /s/; Kconv::SJIS elsif /e/; Kconv::EUC end $out_kanji_code = if /S/; Kconv::SJIS elsif /E/; Kconv::EUC end elsif /^-0([0-7]+)$/ -- ┌─鄭 明毅───────────────────┐ └──tei@harmony.co.jp──tei@mirage.linc.or.jp─┘