レガシーシステムと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]を返します。
だから私が欠けている点は何ですか?
何らかの奇妙な理由により、バイトバッファーを再初期化し、エンディアンの順序を変更した前のコピーを破棄しています。次のコードは私にとってはうまくいきます:
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]
関連するメモ:
このコード:
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番目のスニペットよりも速いことに興味があります。