2010-07-05 18 views
1

Je travaille avec un protocole propriétaire qui transmet des entiers en tant que complément de 16 bit deux en deux parties. Le LSB est transmis en premier suivi du MSB. Le code suivant pour restaurer la valeur d'origine est-il correct?Joindre MSB et LSB d'un entier signé de 16 bits (complément à deux)

unsigned char message[BLK_SIZE]; 
// read LSB to message[0] and MSB to message[1] 
short my_int = (message[1] << 8) | message[0]; 
+0

Attend OK pour moi - ce qui vous fait penser que ce ne soit pas correct? –

+0

Oui, ça a l'air OK. Vous devriez écrire un test pour cela, qui vous dira si c'est OK dans le contexte de votre application spécifique. –

+0

@Paul: Ah j'aurais dû le mentionner. Je ne suis pas sûr parce que: 1) IIRC court n'est pas garanti être 16bit. Qu'est-il arrivé si son 8 ou 32? 2) opérer sur un char non signé et l'affecter à un court fonctionne comme prévu? – Marco

Répondre

1

Je crois que le code échouera si short n'est pas 16 bits, de sorte que votre code peut échouer sur certaines plates-formes. Vous pouvez ne jamais trouver une plate-forme échoue cependant.

int16_t, si disponible sur votre plate-forme (s) cible, peut être un meilleur choix.

+0

D'où vient l'int16_t? Est-ce standard C++, c ou certains trucs POSIX? – Marco

+0

les shorts doivent être au moins 16 bits, donc le code est OK. –

+0

http://linux.die.net/man/3/int16_t – codymanix

0

Votre code semble correct, mais vous pouvez utiliser les fonctions intrinsèques C pour assurer que votre protocole est vraiment indépendant de la plate-forme:

short my_int = ntohs(*(short*)message)

+0

Il veut une conversion spécifique à son propre protocole. –