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
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
とりあえずRubyっぽいスクリプトに書き換えてみました (スコア:1)
組み込みのクラスにメソッドを追加したりとか、
やりたい放題やってます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
Re:とりあえずRubyっぽいスクリプトに書き換えてみま (スコア:1)
シンプルな構造になって、読み書きしやすそうな感じがいいですね。
挙動ですが、data.sizeがBLOCK_SIZEの倍数になると違ってくるようですw
Re:とりあえずRubyっぽいスクリプトに書き換えてみま (スコア:1)
ま、まあバグがあるとはいえ、こんな風にすっきり書けるので最近はRubyしか使ってなかったりします。
Rubyは配列がとても強力なのでこういったものを作るときは配列をどのように使うかまず考えます。もっともだらしない使い方をするとメモリを浪費するわけですけど、よっぽどのことがない限りあまりその辺は考慮しません。
配列ではないですが、このプログラムの例では最初に指定された大きさまでファイルを全部メモリに読み込んじゃうわけでこれもかなりの浪費です。でもそういったことは頭の隅でちらっと思うだけでそのままにしときます。すっきり書いておけばいざというときに書き直すのも楽ですし。