25

レガシー システムと 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] が返されます。

それで、私が見逃しているポイントは何ですか?

4

2 に答える 2

37

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

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] を出力します

于 2012-11-25T17:28:06.633 に答える
1

関連するメモ:

このコード:

 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 を使用。

JNI を介して Java から C++ に Unicode ポイントを渡そうとしていますが、最初の方法が最速です。2 番目のスニペットよりも速いことに興味があります。

于 2014-12-30T22:12:11.110 に答える