パスワードを忘れた? アカウント作成
657861 journal

UrakawaMの日記: Rubyはじめました 3

日記 by UrakawaM
仕事で使えないかと思ってちょっと勉強してみました。
http://www.ruby-lang.org/ja/man/
http://www.namaraii.com/rubytips/
この辺見てとりあえず書いてみたスクリプト。
---
f = open(ARGV.shift, "rb") #バイナリ読み

len = ARGV.shift.to_i
if len==0
    len = f.stat.size
end
data = f.read(len)
len = data.size

for i in 0..(len-1)/16
    #アドレス
    printf("%08x ", i*16)
    #バイナリ出力
    for j in 0..15
        if (len > i*16+j)
            printf(" %02x", data[i*16+j])
        else
            printf("   ")
        end
    end
    print "  "
    #テキスト出力
    for j in 0..((len < i*16+15)?((len-1)%16):15)
        if (len > i*16+j)&&(data[i*16+j]) >= 0x20
            printf("%c", data[i*16+j])
        else
            printf(" ")
        end
    end
    print "\n"
end
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • こんな感じかなあ。多分動作は変わってないはず。
    組み込みのクラスにメソッドを追加したりとか、
    やりたい放題やってますw

    BLOCK_SIZE = 16

    class String
      def to_hex
        '%02x' % self[0]
      end # def
      def printable?
        0x20 < self[0]
      end # def
    end # class

    class NilClass
      def to_hex
        '  '
      end # def
      def printable?
        false
      end # def
    end # class

    data = nil
    open(ARGV.shift, "rb") do |f|
      data = f.read((ARGV.shift or f.stat.size).to_i)
    end

    0.step(data.size, BLOCK_SIZE) do |i|
      block = data[i, BLOCK_SIZE].split(//)
      block.concat([nil] * (BLOCK_SIZE - block.size)) if block.size < BLOCK_SIZE
      # アドレス
      printf("%08x  ", i)
      # バイナリ出力
      print block.map{|a| a.to_hex}.join(' '), '   '
      # テキスト出力
      puts block.map{|a| a.printable? ? a : ' '}.join
    end
    • ありがとうございます。
      シンプルな構造になって、読み書きしやすそうな感じがいいですね。

      挙動ですが、data.sizeがBLOCK_SIZEの倍数になると違ってくるようですw
      親コメント
      • あちゃあ。典型的な境界バグでしたね(汗

        ま、まあバグがあるとはいえ、こんな風にすっきり書けるので最近はRubyしか使ってなかったりします。

        Rubyは配列がとても強力なのでこういったものを作るときは配列をどのように使うかまず考えます。もっともだらしない使い方をするとメモリを浪費するわけですけど、よっぽどのことがない限りあまりその辺は考慮しません。

        配列ではないですが、このプログラムの例では最初に指定された大きさまでファイルを全部メモリに読み込んじゃうわけでこれもかなりの浪費です。でもそういったことは頭の隅でちらっと思うだけでそのままにしときます。すっきり書いておけばいざというときに書き直すのも楽ですし。
        親コメント
typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...