web-dev-qa-db-fra.com

ByteBuffer l'insert Little Endian ne fonctionne pas

Je dois établir une communication bidirectionnelle entre un système hérité et un appareil Android. Le système hérité utilise un ordre de byte légèrement inférieur. J'ai implémenté avec succès la partie réception, mais l'envoi ne fonctionne pas.

Étrange car pour moi, il semble que la classe ByteBuffer fonctionne mal (je peux à peine le croire)

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

Résultats: [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();

Résultat identique: [0, 0, 0, 88]

Cependant, si je ne me trompe pas, les commandes peu endianes devraient revenir: [88, 0, 0, 0]

Alors, quel est le point qui me manque?

16
Sandor

Pour une raison étrange, vous réinitialisez vos tampons d’octets et jetez les copies précédentes dans lesquelles vous aviez modifié l’ordre endian. Le code suivant fonctionne très bien pour moi:

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

Estampes [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));

Impressions [88, 0, 0, 0]

30
Perception

Sur une note connexe:

Ce code:

 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));
 }

Est environ 25% plus rapide que cela:

 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));  
 }

Utiliser JDK 1.8.

J'essaie de passer des points unicode de Java au C++ via JNI et la première méthode est la plus rapide que j'ai trouvée. Curieux qu'il soit plus rapide que le deuxième extrait.

0
Stefano Emiliozzi