-1

バイトとして格納されている符号なしの 32 ビット、64 ビットのプリミティブがあります。Javaでそれらを使用する必要があります。だから私はそれらをバイトから一緒に構築することを考えました。まず、すべてが正しく計算されていることを確認するために、ランダムなバイトで遊んでいます。しかし、私はいくつかの問題に遭遇しました:

// input: array of 4 bytes (unsigned int 0 to 4,294,967,295)
// output: double 0.0 to 1.0 (0 -> 0.0, 2,147,483,647 ~> 0.5, 4,294,967,295 -> 1.0)

byte[] bytes = new byte[100];
(new Random()).nextBytes(bytes); // randomize bytes

long a = (bytes[3] << 24) | (bytes[2] << 16) | (bytes[1] << 8) | bytes[0];
double b = 1.0 * (a & 0xffffffffL) / 0xffffffffL;

System.out.println(bytes[3] + "," + bytes[2] + "," + bytes[1] + "," + bytes[0]);
System.out.println(a);
System.out.println(b);

出力 b はほとんどの場合 1.0 に近く、最大 unsigned int に近い値です。私は何を間違っていますか?必要な動作を取得するにはどうすればよいですか? また、 QWORD の 8 バイトを使用して同じ (正しい計算) を行うにはどうすればよいですか?

4

1 に答える 1

1

バイト配列を double に変換するには、ByteBufferを使用します。コード例については、この質問を参照してください。コード例でわかるように、出力プラットフォームと入力プラットフォームが一致しない場合は、バイト配列のエンディアンの順序を変更する必要がある場合があります。

于 2013-04-15T15:16:47.030 に答える