web-dev-qa-db-ja.com

ByteBufferリトルエンディアンの挿入が機能しない

レガシーシステムとAndroidデバイスの間で双方向通信を行う必要があります。レガシーシステムはリトルエンディアンバイトオーダーを使用しています。受信部を正常に実装しましたが、送信が機能しません。

奇妙なことに、私にとってはByteBufferクラスが誤動作しているようです(私は信じられません)

    ByteBuffer byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
    byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();

結果:[0、0、0、88]

    ByteBuffer byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.order(ByteOrder.BIG_ENDIAN);
    byteBuffer = ByteBuffer.allocate(4);
    byteBuffer.putInt(88);
    byte[] result = byteBuffer.array();

結果も同じ:[0、0、0、88]

ただし、私が間違っていない場合、リトルエンディアンの順序は[88、0、0、0]を返します。

だから私が欠けている点は何ですか?

20
Sandor

何らかの奇妙な理由により、バイトバッファーを再初期化し、エンディアンの順序を変更した前のコピーを破棄しています。次のコードは私にとってはうまくいきます:

ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.order(ByteOrder.BIG_ENDIAN);
byteBuffer.putInt(88);
byte[] result = byteBuffer.array();
System.out.println(Arrays.toString(result));

プリント[0、0、0、88]

ByteBuffer byteBuffer = ByteBuffer.allocate(4);
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
byteBuffer.putInt(88);
byte[] result = byteBuffer.array();
System.out.println(Arrays.toString(result));

プリント[88、0、0、0]

32
Perception

関連するメモ:

このコード:

 int unicodePointsLen = textContent.length() * 2;
 ByteBuffer unicodePointsBuffer = ByteBuffer.allocateDirect(unicodePointsLen);
 short unicodePointValue;
 for (int i = 0; i < textContent.length(); i++) 
 {  
     unicodePointValue = (short)textContent.charAt(i);
     unicodePointsBuffer.put((byte)(unicodePointValue & 0x00FF)).put((byte)(unicodePointValue >> 8));
 }

これよりも約25%高速です。

 int unicodePointsLen = textContent.length() * 2;
 ByteBuffer unicodePointsBuffer = ByteBuffer.allocateDirect(unicodePointsLen);
 unicodePointsBuffer.order(ByteOrder.LITTLE_ENDIAN);
 for (int i = 0; i < textContent.length(); i++) 
 {  
     unicodePointsBuffer.putShort((short)textContent.charAt(i));  
 }

JDK 1.8の使用。

JavaからJNIを介してC++にユニコードポイントを渡そうとしています、そして最初の方法は私が見つけた最速です。それが2番目のスニペットよりも速いことに興味があります。

0