Ok, il semble qu'il y ait des problèmes avec ce que vous faites à deux niveaux différents. Une partie de la confusion semble provenir de votre utilisation de pointeurs, du type d'objets vers lesquels ils pointent, et de l'interprétation du codage des valeurs dans la mémoire pointée par le(s) pointeur(s).
Le codage d'entités de plusieurs octets dans la mémoire est ce que l'on appelle l'endianité. Les deux codages les plus courants sont les suivants Petit Endien (LE) et Grand Endien (BE). Avec LE, une quantité de 16 bits telle qu'un numéro court est codée en premier par l'octet le moins significatif (LSB). Avec BE, l'octet le plus significatif (MSB) est codé en premier.
Par convention, les protocoles de réseau codent normalement les choses dans ce que nous appelons le "network byte order" (NBO), qui se trouve être le même que BE. Si vous envoyez et recevez des tampons de mémoire sur des plates-formes big endian, vous ne rencontrerez pas de problèmes de conversion. Cependant, votre code dépendrait alors de la plate-forme et de la convention BE. Si vous voulez écrire un code portable qui fonctionne correctement sur les plates-formes LE et BE, vous ne devez pas présumer de l'endianité de la plate-forme.
La portabilité de l'endian est l'objectif de routines telles que ntohs() , ntohl() , htons() y htonl() . Ces fonctions/macros sont définies sur une plate-forme donnée pour effectuer les conversions nécessaires aux extrémités d'envoi et de réception :
-
htons() - Convertir la valeur courte de l'ordre hôte en ordre réseau (pour l'envoi)
-
htonl() - Conversion d'une valeur longue de l'ordre de l'hôte à l'ordre du réseau (pour l'envoi)
-
ntohs() - Conversion de la valeur courte de l'ordre réseau en ordre hôte (après réception)
-
ntohl() - Conversion de la valeur longue de l'ordre réseau en ordre hôte (après réception)
Comprenez que votre commentaire sur l'accès à la mémoire lors de la réintégration des personnages n'a aucune incidence sur l'ordre réel des entités dans la mémoire. En d'autres termes, si vous accédez à la mémoire tampon en tant que série d'octets, vous verrez les octets dans l'ordre dans lequel ils ont été encodés dans la mémoire, que vous ayez une machine BE ou LE. Ainsi, si vous regardez une mémoire tampon codée NBO après réception, le MSB sera toujours en premier. Si vous regardez le tampon de sortie après l'avoir reconverti en ordre hôte, si vous avez une machine BE, l'ordre des octets sera inchangé. Inversement, sur une machine LE, les octets seront tous inversés dans le tampon converti.
Enfin, dans votre boucle de conversion, la variable total
se réfère à des octets. Cependant, vous accédez à la mémoire tampon en tant que shorts
. La protection de la boucle ne doit pas être total
mais devrait l'être :
total / sizeof( unsigned short )
pour tenir compte de la nature à double octet de chaque short
.