Sur les deux plates-formes, vous avez
pour short
(16 bits) :htons()
et ntohs()
pour long
(32 bits) :htonl()
et ntohl()
Le htonll()
manquant et ntohll()
pour long long
(64 bits) pourrait facilement être construit à partir de ces deux. Voir cette implémentation par exemple.
Mise à jour-0 :
Pour l'exemple lié ci-dessus, Simon Richter mentionne dans un commentaire que cela ne doit pas nécessairement fonctionner. La raison en est la suivante :le compilateur peut introduire des octets supplémentaires quelque part dans les unions utilisées. Pour contourner ce problème, les syndicats doivent être emballés. Ce dernier risque d'entraîner une perte de performances.
Voici donc une autre approche à sécurité intégrée pour construire le *ll
fonctions :https://stackoverflow.com/a/955980/694576
Mise à jour-0.1 :
D'après le commentaire de bames53, j'ai tendance à conclure que le 1er exemple lié ci-dessus ne doit pas être utilisé avec C++, mais uniquement avec C.
Mise à jour-1 :
Pour obtenir la fonctionnalité du *ll
fonctionne sous Linux, cette approche pourrait être la « meilleure ».
Pas les mêmes noms, mais la même fonctionnalité existe.
MODIFIER :Lien archivé -> https://web.archive.org/web/20151207075029/http://msdn.microsoft.com/en-us/library/a3140177(v=vs.80).aspx
_byteswap_uint64, _byteswap_ulong, _byteswap_ushort
htons et htonl (et les macros similaires) sont bons si vous insistez pour traiter le sexe des octets.
Cependant, il est préférable d'éviter le problème en sortant vos données en ASCII ou similaire. Cela prend un peu plus de place et la transmission sur le réseau est un peu plus lente, mais la simplicité et la pérennité en valent la peine.
Une autre option consiste à séparer numériquement vos entiers et vos courts. Donc, vous &0xff et divisez par 256 à plusieurs reprises. Cela donne un format unique sur toutes les architectures. Mais ASCII a toujours l'avantage car il est plus facile à déboguer.