-4

数値データが 16 ビット形式で格納されているバイナリ ファイルを読み込んでいます。このファイルをビジュアル C++ プログラムで読み取ると正常に動作しますが、次の Java コードを使用すると、目的の結果が得られず、出力がガベージ値のように見えます。RandomAccessFileご覧の通り使っています。しかし、私は絶対にばかげた値を取得しています。さらに、このファイルに浮動小数点値が格納されていますが、readFloat()、 またはを使用している場合readInt()でもreadShort()、目的の結果を得ることができません。どこが間違っているのか教えてください。 ファイルの最初の 10 バイト: 01100000 00000000 00100011 00100000 11000000 00100011 11000001 00100010 10111111 00100001 . 時間を割いてくれてありがとう

public class Test {
    public static void main(String[] args) throws IOException {
        RandomAccessFile data = new RandomAccessFile("D:\\RawEEGData.bin","r");
        try {
            while(data != null) {

                // i have tried readFloat(), readShort() and readInt()
                // but none of them seems to be working
                float myInt16 = data.readFloat(); 

                System.out.printf(" %f\n", myInt16);
            }
        } finally {
            if (data != null) { data.close(); };
        }
     }
 }
4

2 に答える 2

0

int16データが実際に何であるかを明確にする必要があります。

  • バイトオーダー(エンディアン)?
  • 署名済みまたは未署名?
  • 2の補数か何か他のもの?

データがどのような形式であるかを知らない限り、データを正しく解釈することはできません。結局のところ、RandomAccessFileで提供されているメソッドは、Javaで一般的に使用される形式しかカバーしていないため、役に立たない場合があります。

最も可能性の高い問題は、VC ++がプラットフォームに依存する順序でデータを格納するのに対し、Javaは常にビッグエンディアンのバイト順序(別名ネットワークバイト順序)を使用することです。

于 2012-06-22T11:34:25.163 に答える
0

エンディアンの問題のようです。また、同僚が ReadInt16 を使用していた場合、それらの数値は浮動小数点数ではありません。これを試して :

  byte b0 = data.readByte();
  byte b1 = data.readByte();
  int i = (((int)b1)<<8) + b0;
  System.out.print(" int value : " + i);

編集:それがうまくいかない場合は、質問を編集して最初の8バイトを10101000 01...またはヘキサとして表示します

于 2012-06-22T09:29:34.493 に答える