From: "Y. NOBUOKA" Date: 2011-05-26T00:01:23+09:00 Subject: [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)