From: kiwamu Date: 2000-07-24T16:41:51+09:00 Subject: [ruby-list:23992] Re: String#unpack と scanf の関係 Thu, Jul 20, 2000 at 08:44:42PM +0900 において Masaki Fukushima さん曰く: > > 測定データをCのscanfによって処理する仕様にしてしまうと、 > > 測定器が代るたびにCでプログラムを書き直さなくてはならなくなります。 > > GPIBカードに依存する部分はCで書かなくてはならないと思うのですが、 > > GPIBカードにつないだGPIB機器に依存する部分はrubyで書きたいのです。 > > # わがままでしょうか? (^^;; > > あ、そうなんですか。 > そこまで読めませんでした。 すいませんです。説明不足でした。 > > しかもこのret配列は > > > > (long int型 この後に続く要素の数)(float型データ)(float型データ)… > > > > みたいな形式になることもありましてCで変換してしまうのは負けっぽいです。 > > > > scanfのような変換をこーイイ感じに抽象化してくれるモジュールを > > 書くべきなんでしょうか…? > > いや、データのフォーマットさえ正確に分かっていれば、多分できると思 > いますよ。 > > 結局、この「(float型データ)」というデータはバイナリなんですか、文字 > 列なんですか? > > scanfで読めてるとすると、文字列ってことになりますけど。 > > だとすると、各データの区切りはどうなっているのでしょう。 読みたいフォーマット(FORM3とか呼ぶらしい)はIEEE32ビット浮動小数点フォーマット とかいうやつで… 文字列"#6" 6バイトの文字列(この後に続くデータのバイト数) 8バイトのdoubleデータ 8バイトのdoubleデータ … EOI とかなってるみたいです。 require "gpib" dev = Gpib.new(18) # GPIBアドレス18で初期化 dev.write("SING?") # 掃引待ち sleep(9) dev.write("FORM3") # FORM3形式で読み出し dev.write("OUTPSTIM?") # 横軸(周波数)のデータを読む r = "" ; r << dev.read while !dev.eoi # eoi が立つまでデータ読み込み fary = r.unpack("aaaaaaaad*") fary.each{|a| print(a, "\n") } ってなかんじのスクリプトを田鎖さんのGPIBモジュールを使って 書いてみたのですが… # 6 0 0 3 2 0 8 2.213181251e-312 -7.766515835e+255 -1.67565126e+203 -3.816111887e+150 -8.203543647e+97 -1.851627386e+45 -3.968895868e-08 -8.89044621e-61 -1.901112197e-113 -4.232626747e-166 -9.033037558e-219 -1.92688338e-271 1.377639377e+293 2.933988765e+240 6.463747383e+187 1.374874212e+135 4.605570485e+77 9.895050706e+24 … みたいに無意味なデータしか読めないです。 -- Tokyo Metropolitan University Kiwamu Okabe Mail: kiwamu@debian.or.jp URL: http://silica.eei.metro-u.ac.jp/~kiwamu/