• ベストアンサー

bit単位でのデータ読み込みプログラム

現在、気象庁のradarAMeDAS解析雨量データの抽出プログラムを作っています。 radarAMeDAS解析雨量データはランレングス圧縮技術を使用しています。 メタデータはバイト単位のバイナリ形式で読み込みは簡単なのですが、データ部(雨量値)はbit単位での読み取りが必要で、どのようにbit単位で読む込むのか分からず困っています。 どなたかbit単位での読み取りが出来るプログラムの作成方法をご存知の方はいませんか? ちなみに当方は現在fortranでのプログラミングした出来ないため、出来ればfortranでの方法をご教授願えれば幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.2

#1です、専門家と称した手前、もう少しヒントを。 Cなら簡単ですが、FORTRANでも手数は掛かりますが可能です。アセンブラのサブルーチンを作ってしまうのが一番簡単ですが、言語仕様の範囲で考えてみました。 FORTRAN90で、一応、規格にある関数なので使えると思います。言語仕様で論理式は使えないようですので、関数を使います。なお、シフト演算は符号の問題があるので算術演算ではなく、論理関数を使っています。先頭ビットが必ずゼロなら2の冪乗定数を使って除してしまうのが高速でしょう。 たとえば2バイト整数の前12ビットを取り出す場合 INTEGER*2 MASK12 / ZFFF0 / INTEGER*2 DATA, DATA12 READ (xx) DATA DATA12 = ISHIFT(IAND(DATA,MASK12),4) ここで、IAND(DATA,MASK12)で後ろ4ビットを0にし、ISHIFTで4ビット右にシフトしています(FORTRANにはunsignedの概念がないので数値演算では出来ません)。 で、これで、2ワードに渡る領域を取り出したいとき(最初のワードの後ろ4ビットと次のワードの前8ビットの例) INETGER*2 MASK4 / Z000F /, MASK8 / ZFF00 / INTEGER*2 DATA1, DATA2, DATA12 READ (xx) DATA1, DATA2 DATA12 = IOR(ISHIFT(IAND(DATA1,MASK4),-8), ISHIFT(IAND(DATA2,MASK8),8)) ちゃんとデバッグしていないので怪しいのですが、こんな感じで論理演算の関数を駆使してみてください。 処理系によっては、INTEGER*2では関数が上手く動かない場合もあるかと思いますが、その場合は、INTEGER*4で応用してたください。考え方は同じです。 実際にはCでしかできないということはそれほどありません、本当のプロはCOBOLでもFORATRANでも手立てを講じることが出来ます。そりを目指してみてください。

makostar
質問者

お礼

お礼が遅くなりすみません。fortran90以上だとbit演算が出来るんですね。 >本当のプロはCOBOLでもFORATRANでも手立てを講じることが出来ます。 道のりは遠いですが、目指したいです。 ありがとうございました。

その他の回答 (1)

  • ultraCS
  • ベストアンサー率44% (3956/8947)
回答No.1

ビット単位での読み出しは出来ません。データにはバイト単位で誤り訂正符号などが付されており、データ読み出し機器ではバイト単位でこれらの情報を扱っています(というより、実際にはデータブロック単位で読み込んで必要なバイト数だけリクエストを受けたプログラムに転送している)。 ですから、ビット単位での情報が欲しいときは、一定のデータ領域(ブロックやクラスタ単位)でデータを配列に読み込み、マスク定数と論理積をとって取り出したり、シフト演算を使って必要な部分を取り出します。 今、手元にFORTRANの書籍がなく、例示できませんので参考意見とさせていただきます(見つかったらまた投稿します)

makostar
質問者

お礼

さっそくのご回答ありがとうございます。 マスク定数、論理積、シフト演算は今まで知らなかった用語であり、道のりは簡単ではなさそうですが、ultraCSさんの解答を手がかりに勉強してみたいと思います。 fortranでのbit演算に触れている書籍、onlineソースはざっと見た感じではありませんでした。 C言語を勉強した方が良いでしょうか?

関連するQ&A