• ベストアンサー

正の実数のみで書かれたバイナリーファイルの読み込み

fortranにてバイナリファイルの読み込みを試みています。 そのファイルは4バイトの正の実数のみで書かれています。 符号がある無しで表示出来る実数の範囲が異なってくると思うのですが、正数値のみを取り扱わせるような変数宣言はfortranでどのようにすればよいのでしょうか? 単純に「real*4 変数名」と宣言すると読み込んだ値が明らかに 異常値を示します、endian処理はきちんとやっているので 符号のある無しが原因だと想定しています。お知恵をかしてください。

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

  • ベストアンサー
回答No.2

>正の正数です。 これが正の整数という意味なら、 FORTRANには符号なし整数はありません。(私が使っていたFORTRANには無かった) 異常値というのが負数を挿しているなら、 ファイルからInteger*4の変数I4に読み込んだ後、 Integer*8かReal*8の変数D8で if I4<0 then D8 = 2**32 - I4 else D8 = I4 end if とすれば変換できます。(ソースコードはFORTRAN風BASIC) >単純に「real*4 変数名」と宣言すると読み込んだ値が明らかに 異常値を示します Integer*4で書かれたデータをReal*4で読み込めば異常値になるのは当然です。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

4バイトの正の実数とは? 実数型で正の範囲だけ扱うような型は普通の処理系ではないですよ。 元のバイナリファイルは何で作成したものですか。 またfortranでの読み込みはどんなコンピュータでやっていますか。 不動小数点数型の表現にはIEEE754とIBM方式など互換性のない方式があります。同じ4バイト表現でも方式が異なれば同じには読めません。

makostar
質問者

お礼

すみません。正の正数です。 書き出しも同じ処理系で行っています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • バイナリから実数を取得したいのですが・・・

    C++にてバイナリデータから倍精度の浮動小数を取得したいと考えています。 バイナリの中にリトルエンディアン形式で倍精度の浮動小数が64ビット幅に収められています。 これをdouble型の変数に代入したいのですが、どうすれば(できれば簡単な方法で)値を代入できるでしょうか? ご教授お願いします。 データのサンプルを念のために記載させて頂きます。 B2 9C 05 DA 7D 40 6C 3F -> 3.448720745086919e-3

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

    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
  • バイナリデータからの値の取得について教えてください

    今、バイナリデータから値を取りだそうとがんばっています。 しかし、うまくいかずに困っています。 困っていることは2点あります。 (1)バイナリデータにはリトルエンディアンで格納していると書いています。 まず、リトルエンディアンで書かれている場合、どのような処理を考えることが必要なのでしょうか? (2)バイナリデータには、 はじめに文字列(char)型4バイトで「RIFF]という値 次に32ビット符号なし整数で4バイトの数字、 次に4052バイトの構造体 などと収納されているようです。 このように入っているデータから値を取得するにはどのようにしたらよいのでしょうか? 全然できなくて困っています。 教えていただけないでしょうか? よろしくお願いいたします。

  • バイナリファイルの計算方法

    バイナリデータをはじめて扱う初心者です。 バイナリデータファイルからデータを読み出したいと思います。 環境はWindowsXPとLabView7.1です。 バイナリエディタで見てみると、  E8 03 と格納されている、2バイトshort型のデータがあります。 LabView7.1を使って、E8 03 という配列要素を読み出すことまではできました。 次に、この値を10進数で表現すると、いくつになれば正解なのでしょうか? (E8 03 という値をどのように計算して10進数にすればいいのでしょうか?) 私なりにプログラムした結果、-24か232のどちらかだと思うのですが自信がありません。 (データ自体が計測器が吐き出したデータなので、どのような値が入っているかわからないのです。 LabViewがビックエンディアンを使っていることも、正解に自信が持てない一因です) バイナリエディタで10進数に変換してくれるようなツールがあれば一番いいのですが。 ご存知の方がいらっしゃいましたら、ご教授ください。

  • バイナリファイルの読込み(小数の扱いについて)

    お世話になっています。 今、バイナリファイル(BSQフォーマット)を読み込むプログラムをC言語で書こうとしています。バイナリファイルの内容は数字(実数)の配列です。 そのバイナリファイルは、1数字につき2バイトしかなく、浮動小数点(float4バイトとdouble8バイト)などが使えませんでした。 なので、固定小数点なのかと思い、1バイトずつcharで読み込んだところ整数部分だけうまく読み込めました。しかし小数部分がうまくいきませんでした。 バイナリエディタで見たところ以下のようになっていました。 例:C2 FF(or 00) (この値が-62になることは分かっています。) しかし、上記の方法で読み込んだ結果は-62 -1でした。 そこで質問なのですが、 (1)2バイトの実数を1バイトで区切って整数と小数に分けて行うことなどあるのでしょうか? (2)上記の方法で行った場合、FFが-1になり、00も-1になってしまいます。本来なら小数部分のFFも00も値は0にならなければいけないのですが・・・。これは、どのように解決すればいいのでしょうか? 部分的に間違っている。根本的に間違っている。などなど アドバイスよろしくお願いします。

  • fortranの整数と実数

    fortranに関する質問です. 型宣言を下のように行った上で,計算を行うと dが110ではなく,109と出力されるのですが,なぜでしょうか. dも実数で宣言しておくと110.0000と表示されます. こうなる理由と解決策をぜひお教えください. real a,b,c integer d a=33.0 b=3.0 c=0.1 d = (a/b)/c write(*,*) d

  • バイナリ出力

    バイナリのテストデータを作成しており、VBAで作成中です。 以下の内容で困っております。 「0~65525の値を2バイトの情報(VCでいうunsigned shortの型)としてバイナリファイルに出力する。」 変数long型で値を取得した場合、4バイトの情報としてバイナリ出力されてしまいます。これを2バイトの情報として出力する方法をご教授願えないでしょうか? よろしくお願いします。

  • FLASH8 外部テキストファイルの読み込みについて

    外部テキストファイルの読み込みを参考資料などを見ていると、下記のような形式で読み込みを行っているのですが。 a.txt --------------------- 任意の変数名1=値 任意の変数名2=値 任意の変数名3=値 --------------------- 下記のようなテキストファイルを読み込むことは可能でしょうか? a.txt --------------------- 2<>名前<>メールアドレス<>画像.jpg<> 1<>名前<>メールアドレス<>画像.jpg<> --------------------- ※最初の1文字目は連番の数字です 前文の方の読み込みは成功しておりますが、下の内容については、どうすればよいかわかりません・・・ 読み込みができるのであれば、各行はsplitで配列に格納したいと思っています。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Flash
  • Fortranの変数

    Fortranの変数の取り扱いに関する質問です。 実数で宣言した変数に 33.3 という数字を読み込ませたのですが, そのまま書式を指定せずに書き込ませると 33.2999992 と表示されました。 これはなぜなのでしょうか。

このQ&Aのポイント
  • 【廃トナーボックスを交換したのにアラートが出続ける】
  • お使いのブラザー製品の廃トナーボックスを交換したのに、アラートが続いて表示されます。対処方法や解決策を教えてください。
  • この記事では、ブラザー製品の廃トナーボックスを交換した後にアラートが続いて表示される問題について解説します。解決策や注意点についても紹介します。
回答を見る