2011年5月26日

[ruby-list:48115] Re: データ整形

信岡です。

既に渡辺さんがすっきりしたコードを書いておられるのであんまり意味がないですが
私も書いてみたのでお送りします。

細かい部分ですが、渡辺さんのコードだと
> printf "0x%4x %s\n", address, ARGF.read(readsize)
のところで、address の 16 進数表示が 4 桁にならない場合に

"0x 7FF" のように "0x" の後ろに空白が表示されてしまうので、
"0x%4x" の部分は "0x%04x" にしたら良いと思います。

以下私のコードです。
無駄に長いですが、整形の方法に関する部分など参考になれば。

#! ruby
# coding: UTF-8

# 読み込むファイル名
input_file_name = 'input.txt'
# 繰り返し回数
# 最初の32文字で改行しデータ出力→2回繰り返し
# 次の4文字で改行しデータ出力
# 次の14文字で改行しデータ出力→43回繰り返し
# 次の32文字で改行しデータ出力→43回繰り返し
format_info = [ [32,2], [4,1], [14,43], [32,43] ]
# 最初のメモリ位置
mem_addres = 0x3000


# 入力データ
input_data = nil
# 整形後のデータ
output_data = ''
# データの読み込み
File.open( input_file_name, 'r' ) do |f|
input_data = f.read()
end

# 位置情報
n = 0
# 整形
format_info.each do |e|
e[1].times do
# 整形した 1 行を出力データに追加
output_data << "0x%04X %s\n" % [ mem_addres, input_data[n,e[0]] ]
# 位置情報の更新
n += e[0]
mem_addres += e[0] / 2
# 2 で割り切れないならエラーにする?
e[0] % 2 == 0 or raise 'Invalid format_info'
end
end
# 残ったデータも出力?
if n < input_data.length
output_data << "0x%04X %s\n" % [ mem_addres, input_data[n..-1] ]
end

# 標準出力へ
$stdout << output_data


--
信岡 ゆう (NOBUOKA Yu)


投稿者 xml-rpc : 2011年5月26日 00:01
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/103961
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。