From: nkon@...2.3web.ne.jp Date: 1998-02-07T11:06:20+09:00 Subject: [ruby-list:6333] ruby 流に添削して下さい 近藤ともうします。 ruby でプログラムを書いてみたのですが、なんか、しっくり来ないので、 ruby 流の書き方に添削して欲しいのですが、構わないでしょうか。 プログラムは以下のとおりで、これは、IHX8M という、ROM に書き込む時とか に使われるファイルフォーマットを解釈する、Ihx8m というクラスです。 IHX8M は先頭に コロン、次にその行の長さ、アドレス、識別子、データ、チェッ クサムと続く行形式のデータです。サンプルデータをその次に示します。 ixh.rb の最後でコメントにしてある部分を有効にすると、このプログラムで 私が期待した動作はしています。 動作環境は ruby 1.1b6(98/01/23) [i586-linux] です。 データメンバの初期化、配列の使い方、イテレータの使い方 文字列の処理方法など、がとくに良くわからなかったので、 思考錯誤で書いています。 -- 近藤靖浩 http://www2.osk.3web.ne.jp/~nkon/3web/ http://tsl.pe.u-tokyo.ac.jp/~kon/tslhome/ -- ihx.rb class Ihx8m def initialize(filename = nil) if (filename) parse(filename) end end # ファイルの解釈 def parse(filename) @memory = Array.new file = open(filename) file.each_line do |line| break if (line == ":00000001FF\n") parse_line(line) end end def memory @memory end # 一行解釈 def parse_line(line) line.chop! sum = 0; leader = (line[0,1]).hex; line[0,1] = ""; length = (line[0,2]).hex; sum += length; line[0,2] = "" address = (line[0,4]).hex/2; sum += line[0,2].hex + line[2,2].hex;line[0,4] = ""; type = line[0,2]; line[0,2] = ""; checksum = (line[line.length-2,2]).hex; line[line.length-2,2] = "" data = line rep = 0; while(data.length > 0) sum += data[0,2].hex + data[2,2].hex value = (data[2,2] + data[0,2]).hex data[0,4] = "" @memory[address] = value address += 1; end if ((~(sum-1) & 0x00ff) != checksum) raise "Ihx8m Checksum ERROR\n" end end # end of parse_line # 文字列形式でダンプする def to_s i = 0; ret = "" length = @memory.length while(i < length) ret += sprintf("%04x %04x\n", i, @memory[i]) if (@memory[i]) i = i+1 end ret end end # end of Ihx8m # ihx = Ihx8m.new # ihx.parse('morse.hex') # print ihx.to_s -- 参考データ morse.hex :020000001528C1 :100008009100030E92008D03031D0D2805308D000D :100018008C03100885060B11120E8300910E110E29 :100028000900FF3085008316FC308500813081008F :10003800831201308D009001A0308B008901831656 :10004800081483120808031922282C20890A232857 :100058008E000E090319442807308F008E1B37289D :100068008F038E0D32288E0D8E1F4B208E1B49203C :100078008E0D0F3051208F0B38281E30512008006C :100088001E3051202D30512008002D304C280F30C3 :10009800101451201010051408008C008C1F5228D1 :0200A80008004E :02400E00F23F7F :1042000010000200140014000F00FF000B000F004C :0A4210000A0014000C00FF0000007B :00000001FF