1

私が読んでいるディスク上に、c/c++ コードで書かれたファイルがあります。読み取る 2 つの 64 ビット符号なし整数があることはわかっていますが、Java は符号なし整数をサポートしていないため、DataInputStream.readLong() を実行したときに取得する値は正しくありません。(今のところバイトオーダーは無視してください。実際には、WebからダウンロードしたLEDataInputStreamと呼ばれるDISの派生物を使用しています)

ここの多くの投稿では BigInteger の使用について話していますが、bytearray を読み取るための javadoc は bytearray 表現のロードについてのみ話しています。質問は、一部の人々が Java long 型の正の境界の外に出ているという事実に集中しているようです。私が読んでいるデータにはほど遠いでしょう。

これらの長い長い値をそれぞれ2つの32ビット整数として読み取り、必要な答えを得るために乗算と加算を行うMATLab/Octaveスクリプトがあります。

問題は、BigInteger または [LE]DataInputStream.XXX を使用して 64 ビットの符号なし整数を読み取るにはどうすればよいかということだと思います。

前もって感謝します

4

3 に答える 3

3

ByteBufferを使用してから、このようなコードを使用して必要なものを取得することをお勧めします。

于 2011-02-09T12:35:09.107 に答える
1

longを 64 ビット値として使用して、符号なしデータを格納できます。これは、ほとんどのUnsignedlong操作が標準型を使用して実行できることを示すモジュールです。これが問題であるかどうかは、値をどうしたいかによって異なります。

編集: 符号なし数値を処理する一般的な方法は、データ型を拡張することです。多くの場合、これはより単純ですが、要件ではありません (そして、long使用BigIntegerしても物事が単純になるわけではありません)

EDIT2: 次のコードの何が問題になっていますか?

long max_unsigned = 0xFFFFFFFFFFFFFFFFl;
long min_unsigned = 0;
System.out.println(Unsigned.asString(max_unsigned) + " > "
        + Unsigned.asString(min_unsigned) + " is "
        + Unsigned.gt(max_unsigned, min_unsigned));

版画

18446744073709551615 > 0 is true
于 2011-02-09T12:46:00.547 に答える
0

まず、この質問をチェックしてください

こちらもご覧ください

BigInteger クラスの使用

// Get a byte array
byte[] bytes = new byte[]{(byte)0x12, (byte)0x0F, (byte)0xF0};

// Create a BigInteger using the byte array
BigInteger bi = new BigInteger(bytes);

// Format to binary
String s = bi.toString(2);      // 100100000111111110000

// Format to octal
s = bi.toString(8);             // 4407760

// Format to decimal
s = bi.toString();              // 1183728

// Format to hexadecimal
s = bi.toString(16);            // 120ff0
if (s.length() % 2 != 0) {
    // Pad with 0
    s = "0"+s;
}


// Parse binary string
bi = new BigInteger("100100000111111110000", 2);

// Parse octal string
bi = new BigInteger("4407760", 8);

// Parse decimal string
bi = new BigInteger("1183728");

// Parse hexadecimal string
bi = new BigInteger("120ff0", 16);

// Get byte array
bytes = bi.toByteArray();
于 2011-02-09T12:37:32.250 に答える