現在、気象庁のradarAMeDAS解析雨量データの抽出プログラムを作っています。
radarAMeDAS解析雨量データはランレングス圧縮技術を使用しています。
メタデータはバイト単位のバイナリ形式で読み込みは簡単なのですが、データ部(雨量値)はbit単位での読み取りが必要で、どのようにbit単位で読む込むのか分からず困っています。
どなたかbit単位での読み取りが出来るプログラムの作成方法をご存知の方はいませんか?
ちなみに当方は現在fortranでのプログラミングした出来ないため、出来ればfortranでの方法をご教授願えれば幸いです。
No.1
- 回答日時:
ビット単位での読み出しは出来ません。
データにはバイト単位で誤り訂正符号などが付されており、データ読み出し機器ではバイト単位でこれらの情報を扱っています(というより、実際にはデータブロック単位で読み込んで必要なバイト数だけリクエストを受けたプログラムに転送している)。ですから、ビット単位での情報が欲しいときは、一定のデータ領域(ブロックやクラスタ単位)でデータを配列に読み込み、マスク定数と論理積をとって取り出したり、シフト演算を使って必要な部分を取り出します。
今、手元にFORTRANの書籍がなく、例示できませんので参考意見とさせていただきます(見つかったらまた投稿します)
さっそくのご回答ありがとうございます。
マスク定数、論理積、シフト演算は今まで知らなかった用語であり、道のりは簡単ではなさそうですが、ultraCSさんの解答を手がかりに勉強してみたいと思います。
fortranでのbit演算に触れている書籍、onlineソースはざっと見た感じではありませんでした。
C言語を勉強した方が良いでしょうか?
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でも手立てを講じることが出来ます。
道のりは遠いですが、目指したいです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 非表示にしたい行をグループ化して折り畳み 4 2022/09/17 20:17
- CAD・DTP JWW-CADでDXF変換後の線が連動して消える 2 2023/01/13 11:09
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- ドライブ・ストレージ Win10と7のPCで書き込みしていないDVD-Rが読み込めない。 5 2022/06/10 16:47
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- 医学 二次医療圏の人口分布 1 2023/05/10 11:37
- Excel(エクセル) Excelグラフについて 1 2023/05/12 16:26
- オープンソース IT用語、ソースとオブジェクト、改変と翻訳と翻案の違いなど どのようにりかいすればよいのですか 1 2022/09/09 10:02
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
BMP画像のネガを作成するプログ...
-
PS3に搭載されている"Cell"は、...
-
8ビットのデータの、先頭ビット...
-
数独の3国同盟のアルゴリズム...
-
C言語で128bitの2進数のビット...
-
命令について
-
ビットシフトってどんな時使うの?
-
レジストってなんですか?
-
PICに書き込むプログラムや変数...
-
[C言語→アセンブリ言語]はどう...
-
PICでパルス数をカウントする方法
-
PICでパルス数をカウントし、カ...
-
バイナリの実行ファイルをgccを...
-
素数を求めるプログラム(アセン...
-
PC-G830
-
アセンブラでRS-232Cを制御
-
8086アセンブラで、メモリ間の...
-
アセンブラwordという単位
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0xffffとは?
-
エクセルVBAのIf,Then 構...
-
8ビットのデータの、先頭ビット...
-
ビットシフトってどんな時使うの?
-
verilog 符号付加減算(最上位...
-
一般のソフトで画像を扱う場合...
-
符号無し整数xを右にnビット回転
-
文字参照は10進数と16進数では...
-
シーケンス制御についての質問...
-
BMP画像のネガを作成するプログ...
-
アクセス(2003)のVBAでビット...
-
03分22秒36のような時間の単位...
-
命令について
-
10進数(+-)→2進数への変換(2)
-
C言語で128bitの2進数のビット...
-
1の補数
-
ビット列を表示するプログラム
-
ビットの取り出し方法
-
Python: 数値を反転させたい
-
PS3に搭載されている"Cell"は、...
おすすめ情報