現在、気象庁のradarAMeDAS解析雨量データの抽出プログラムを作っています。
radarAMeDAS解析雨量データはランレングス圧縮技術を使用しています。
メタデータはバイト単位のバイナリ形式で読み込みは簡単なのですが、データ部(雨量値)はbit単位での読み取りが必要で、どのようにbit単位で読む込むのか分からず困っています。
どなたかbit単位での読み取りが出来るプログラムの作成方法をご存知の方はいませんか?
ちなみに当方は現在fortranでのプログラミングした出来ないため、出来ればfortranでの方法をご教授願えれば幸いです。
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でも手立てを講じることが出来ます。そりを目指してみてください。
お礼が遅くなりすみません。fortran90以上だとbit演算が出来るんですね。
>本当のプロはCOBOLでもFORATRANでも手立てを講じることが出来ます。
道のりは遠いですが、目指したいです。
ありがとうございました。
No.1
- 回答日時:
ビット単位での読み出しは出来ません。
データにはバイト単位で誤り訂正符号などが付されており、データ読み出し機器ではバイト単位でこれらの情報を扱っています(というより、実際にはデータブロック単位で読み込んで必要なバイト数だけリクエストを受けたプログラムに転送している)。ですから、ビット単位での情報が欲しいときは、一定のデータ領域(ブロックやクラスタ単位)でデータを配列に読み込み、マスク定数と論理積をとって取り出したり、シフト演算を使って必要な部分を取り出します。
今、手元にFORTRANの書籍がなく、例示できませんので参考意見とさせていただきます(見つかったらまた投稿します)
さっそくのご回答ありがとうございます。
マスク定数、論理積、シフト演算は今まで知らなかった用語であり、道のりは簡単ではなさそうですが、ultraCSさんの解答を手がかりに勉強してみたいと思います。
fortranでのbit演算に触れている書籍、onlineソースはざっと見た感じではありませんでした。
C言語を勉強した方が良いでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語で128bitの2進数のビット...
-
コンピュータが処理できるビッ...
-
「ひまわり」と「なでしこ」の違い
-
符号無し整数xを右にnビット回転
-
0xffffとは?
-
ギルバートモデルの、ビット誤...
-
算術シフト演算が成り立つ理由...
-
ビット立つの意味
-
一般のソフトで画像を扱う場合...
-
アセンブリ言語の質問のコト
-
数値計算における誤差について
-
エクセルVBAのIf,Then 構...
-
シーケンス制御についての質問...
-
CASLIIのCPLとCPAについて
-
8ビットのデータの、先頭ビット...
-
C++ のDLLがdelphiで読めない
-
PC-9801でマシン語を学習するに...
-
昔のゲーム製作に使用する言語...
-
PC-9801 MS-DOSでの実行ファイ...
-
アセンブラからC言語に変換する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
8ビットのデータの、先頭ビット...
-
エクセルVBAのIf,Then 構...
-
一般のソフトで画像を扱う場合...
-
ビットシフトってどんな時使うの?
-
シーケンス制御についての質問...
-
文字参照は10進数と16進数では...
-
C言語で128bitの2進数のビット...
-
Python: 数値を反転させたい
-
2の補数
-
verilog 符号付加減算(最上位...
-
アクセス(2003)のVBAでビット...
-
命令について
-
算術シフト演算が成り立つ理由...
-
符号無し整数xを右にnビット回転
-
03分22秒36のような時間の単位...
-
16進数でのAND演算
-
[VBS] 素早くローテート演算したい
-
整数除算の意味とは?
-
Javaの問題について
おすすめ情報