2010-05-24 27 views
6

J'ai une trame de 22 octets. Le cadre est le flux d'entrée d'un accéléromètre via bluetooth. Les lectures de l'accéléromètre sont un nombre de 16 bits divisé sur deux octets. Lorsque j'essaie de fusionner les octets avec le tampon [1] + buffer [2], plutôt que d'ajouter les octets, les résultats sont placés côte à côte. donc 1 + 2 = 12.Fusionner deux octets dans Java/Android

Quelqu'un pourrait me dire comment combiner ces deux octets pour obtenir le nombre d'origine. (BTW les octets sont envoyés peu endian)

Merci

+0

Examiner les opérations de bits et de décalage de bits. http://leepoint.net/notes-java/data/expressions/bitops.html – HXCaine

+0

Jetez un oeil à cette question: http://stackoverflow.com/questions/1026761/how-to-convert-a-byte-array -to-its-numeric-value-java –

Répondre

17

est ici le code:

public static short twoBytesToShort(byte b1, byte b2) { 
      return (short) ((b1 << 8) | (b2 & 0xFF)); 
} 
+0

C'est génial, Merci un million – Shane

+0

@Shane, si cela fonctionne pour vous, vous devez 'Accepter' la réponse :) – reflog

+0

Désolé, je n'avais pas réalisé que vous pouviez accepter des réponses. Merci! – Shane

-1

Voici une meilleure réponse qui pourrait faire un peu plus de sens ...

public static short twoBytesToShort(byte b1, byte b2) { 
      return (short) ((b1 << 8) | b2); 
} 

(b2 & 0xFF) sort avec le même motif binaire exact.

+0

C'est complètement faux et pourrait donner un mauvais résultat. Le & OxFF est un must !!! Ceci est dû au fait que certaines architectures Java font des promotions entières donc si 'b2'> 127 le résultat aura un signe négatif (le bit le plus haut de 'b2' est devenu le bit de signe puisqu'il a été promu au 32ème bit entier) . J'ai personnellement vu cela se produire (Sur les appareils Android 6) – DanielHsH