2

raw-bytes 値を Java 型に変換する際に問題があります。データグラム ソケットでバイト配列としてバイトを受信して​​います。どのバイトが何を意味するかは正確に知っていますが、それらを適切に変換する方法がわかりません (つまり、オフセットは知っていますが、受け取ったと思うものが正しいかどうかはわかりません;))。

たとえば、16 ビットの unsigned short を Java int 型に変換したいとします。私はウェブでいくつかの例を見つけました.1つは次のとおりです。

public int getUShort(byte[] bytes, int offset) {
    int b0 = bytes[offset] & oxFF;
    int b1 = bytes[offset + 1] & oxFF;

    return (b1 << 8) + (b0 << 0);

もう1つは同じですが、最後の行は次のとおりです。

return (b0 << 8)  + b1;

もちろん、それは異なる結果をもたらします。どちらが正しいですか?同じことを行う方法の有効な例も教えてください。

前もって感謝します!

4

3 に答える 3

3

しばらく前にこれに似た作業を行う必要がありましたが、この種の作業を行う最善の方法は、 、 などへのByteBuffer変換を使用することであることがわかりました。を呼び出して、バイト配列を に変換できます。DoubleBufferLongBufferByteBuffer

ByteBuffer myBuffer = ByteBuffer.wrap(myRawArray);

そこから、をint呼び出すことで、バイトのビューを s のリストとして取得できます。

IntBuffer myIntBuffer = myBuffer.asIntBuffer();

そして、呼び出してバイトを変換できます

int nextInt = myIntBuffer.get();

これらのクラスは、大量の get 操作もサポートしているため、ネットワーク経由で同じタイプのデータを大量に受信していることがわかっている場合は、変換を非常に迅速に行うことができます。

別の方法として、可能であれば、ある種の Java ベースのシリアライゼーションを使用してネットワーク経由でデータを送信する方法があります。これにより、ストリーム ライター クラスを使用して、より簡単に変換を行うことができます。もちろん、特に Java 以外のサーバーと通信している場合は、これを利用できないかもしれませんが、調べてみる価値はあります。

于 2011-01-16T21:30:38.817 に答える
1

この件に関しては本当に遅い。

どちらも、データのエンディアンに基づいて正しいです。ここを参照してください: http://en.wikipedia.org/wiki/Endianness

return (b1 << 8) + b0;//little endian
return (b0 << 8) + b1;//big endian
于 2012-04-17T16:45:27.487 に答える
1

DataInputStream または ByteBuffer を使用して、さまざまな型を読み取ることができます。ほとんどの操作で、符号付きの型を符号なしの値として同じように使用できます。署名された型をunsignedであるかのように使用する方法を説明するために、簡単なクラスを作成しました。

ByteBuffer b = ByteBuffer.wrap(bytes);
short s = b.getShort();
long l = b.getLong();
于 2011-01-16T21:31:25.060 に答える