• ベストアンサー

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

  • バイナリファイルをバイト単位でアクセスするには?

     大サイズのバイナリファイルに対して、perlでチェックサムを調べたりCRCチェックをかけるプログラムを作成したいと考えています。従って、そのバイナリファイルからバイト単位でデータを取り出して、計算するということをしなければならないのですが、いちばん基本的なところの、『バイナリファイルからバイト単位で順番にデータを取り出す方法』がわかりません。  よろしくお願いします。

    • ベストアンサー
    • Perl
  • 【fortran77】空行を含む数値データの読み込み

    fortran77でプログラムを書いています。 いま以下のような空行を含むデータファイルを読み込んで、プログラム中で計算し、その結果を別のファイルに書き出すものを作りたいと考えています。 1.0 1.1 1.2 1.3 1.0 1.4 1.5 1.6 2.0 2.1 2.2 2.3 2.0 2.4 2.5 2.6 3.0 3.1 3.2 3.3 3.0 3.4 3.5 3.6 *数字はあくまでも例です。 例えば、1列目が2.0で始まる箇所のみ取り出したいのですが、どうもデータの読み込みのところでエラーが起こっているようです。 open(1,file="data.dat") do i = 1,8 read(1,*) (a(i,j),j=1,4) enddo 空行や空白の読み飛ばしを行う方法を自分なりに調べてみて、open文にblankを指定するなどの方法があることはわかったんですが、いまいち使いかたがわからず立ち止まってしまいました。 よろしくお願いします。

  • FORTRANでGUIプログラム

    FORTRANでGUIプログラム FORTRANでGUIを持ったWINアプリを作成することは不可能でしょうか? 現在自作でFEMプログラムをつくっています。入力ファイルはその度簡単なプログラムをつくって作成するか,汎用のプリプロセッサを利用しています。解析結果は自作で応力図などをeps形式で可視化してはきだすようにしていますが,市販のプログラムのように,画面上で節点や要素を作成していき,それがリアルタイムに画面に表示されて,入力ファイル作成から解析,後処理までをすべてマウス操作でできるようにしたいです。 C++ではできることは分かるのですが,FORTRANしか使ったことないので,FORTRANで作りたいと思っているのですが,やはり数値解析以外のことはFORTRANでやるのは無理なのでしょうか?FORTRANでプリプロセッサが自作できるかどうか,もし可能なら参考書籍などがあれば教えていただきたいです。よろしくお願いします。

  • 32bitパソコンのデータを64bitパソコンで使えますか?

    32bitパソコンのデータを64bitパソコンで使えますか? 現在、Win XP 32bitのパソコンを使用しています。Win7 64bitのパソコンを購入した場合、32bitのパソコンで作成した各種データ(ACCESS、EXCEL、JPG画像等)は使用(表示、加工処理等)出来なくなるのでしょうか。使用出来ない場合、その対処方法もご指導下さい。

  • プログラムの発散

    お忙しいところすみません. 現在,私は大学院生で,研究でfortranを 使用しています. 解析のためにプログラムを組んでいるのですが発散がおき,なかなか研究が進みません. 理論的に間違えているのか,プログラムの組み方が悪いのか,わからずに困っています. これが解決すれば研究が進むのですが・・・ そこでみなさんに質問です.このような経験をされ,見事解決された方いましたらその体験談をお聞かせ願いたいのですが. 暇な時に回答していただいて結構です.

  • バイナリファイルの読み込みについて

    java初心者です。 今バイナリファイルの読み込みを行っているのですがバイナリファイルのデータの値とプログラムで読み込んだ値が違っているので困っています。 バイナリファイルはASCIIテキストになっていてデータを見ることができ中身は -0.00012 -0.00009 -0.00009 -0.00012 -0.00009 -0.00009 -0.00009 -0.00012 ・・・・・・・(値が続くという意味です) となっています。 作ったプログラムは import java.io.*; class a { public static void main(String[] args) { try { FileInputStream in = new FileInputStream("file name"); int ch; while ((ch = in.read()) != -1) { System.out.println(ch); } in.close(); } catch (IOException e) { System.out.println(e); } } } で作って読み込んでみたのですが出力された値は 45 48 46 48 48 48 49 50 ・・・・・・ になってしまいます。 どのようにしたら値が等しくなるのでしょうか。教えてください。

    • ベストアンサー
    • Java
  • バイナリ読み込みについて

    お世話になります。バイナリファイルの読み込みについて質問させてください。 バイナリファイルはC#で出力したものでushort型(符号無し16bit)で書き込んでいます。 //C#でushort型データのバイナリ書き込み例 private static void WriteBinary(){  ushort data=5000;   BinaryWriter bw = new BinaryWriter(new FileStream(@"C:\Binary.txt", FileMode.Create, FileAccess.Write)); bw.Write(data); bw.Close(); } これをJavaで読んで、書き込んだ値5000を取得したいのですが、 C#のushortは符号無しの2Byteなんので、Javaでそれに相当するように readUnsignedShortで読み込んだのですがうまくいきません。どなたかご教授ください。 //Javaでushort型データのバイナリ読み込み private static void ReadBinary(){  DataInputStream dis = new DataInputStream(new FileInputStream("C:\\Binary.txt"));  int data = dis.readUnsignedShort();  System.out.println(data);  } すると「34835」と表示されます。その他、readShort()→-30701 read(byte[2])として byteに格納してbyte[0]と[1]を足しても-101になり取得できませんでした。 保存されたデータは符号なしの16ビットなのでreadUnsignedShort()で取得できると 思ったのですが、何か根本的に考え方が違うのでしょうか?? ※もちろんC#でReadInt16で読み取ると正常に5000を取得できした。

    • ベストアンサー
    • Java
  • データの数を数えるfortran プログラム

    横にm個、縦にn個の実数データが整然と並んでいます。ファイルを開いて読み込むのですが、縦横に何個のデータがあるかプログラムに感知させる方法があるでしょうか。 縦にn個のデータがあることは簡単でした。しかし横にm個あることを感知させるのが難しいです。今は、とにかく全データの個数を調べて、その個数をnで割って求めています。 全データを読む方はは、1個読んで巻き戻し、2個読んで巻き戻し、3個読んで巻き戻し、.... としてデータをこれ以上読めないというところまで読んでその個数が全データということになります。この部分がかなり時間を使います。データを開いてエディタで1行目のカラム数を数えればいいわけですが、プログラム的にはどうなるでしょうか。Cだったら、改行を感知させるという方法があるかもしれません。Fortranだったらどうなるでしょうか。 ※Fotranの専門の会議室がないのかなと思っていますが。

  • 気象データを得るには?

    過去から現在の気温や湿度などの気象データを取得し、グラフで表示させるプログラムを作りたいと思っているのですが、無料で気象データを提供しているサイトはあるでしょうか?できれば加工しやすいデータをお願いしたいです。 よろしくお願いします。

  • FORTRAN77で作ったプログラムを開くとバイナリファイルと認定され、編集できません

    FORTRAN77を最近勉強し始めました(プログラミング自体が超初心者です)。 ネットで情報を集め、コンパイラーはFTN77、エディタはCPadというフリーソフトを インストールし、実際にプログラムを作って実行してみたました。 一応は上手くいったみたいなのですが(非常に簡単な計算なので)、 いったんエディタを閉じて再び開いてみると、 「ファイル~~~はバイナリファイルと判定されました。無視して開きますか?」 という警告が出て、開いてみると意味不明な文字列が書いてあるだけで もともと何が書いてあったかわかりません。 どうしてこのようなことになってしまうのでしょうか?

このQ&Aのポイント
  • 4つ切サイズまでの写真をプリントするには、どのサイズが適切でしょうか?3Mから36Mまでのデジタルカメラ画素数を比較しましょう。
  • 写真プリントにおすすめの画素数は、3Mから36Mまで様々なオプションがあります。選ぶ際には、プリントのサイズや使用用途などを考慮しましょう。
  • 写真をプリントする際には、適切な画素数を選ぶことが重要です。3Mから36Mまでの画素数を比較し、4つ切サイズまでの写真プリントに最適なサイズを見つけましょう。
回答を見る