Casting portable signé / octet non signé, C ++
-
16-09-2019 - |
Question
J'utilise signé à l'octet non signé (de int8_t) Caste pack byts.
uint32_t(uint8_t(byte)) << n
Cela fonctionne en utilisant GCC sur Intel Linux. Est-ce portable pour d'autres plates-formes / compilateurs, par exemple PowerPC? est-il une meilleure façon de le faire? à l'aide bitset n'est pas possible dans mon cas. J'utilise stdint via boost
La solution
Si vous utilisez boost/cstdint.hpp
de la bibliothèque Boost entier, alors oui, les typedefs sont portables (multi-plateforme.) L'en-tête boost/cstdint.hpp
vise à mettre en œuvre la fonctionnalité de C99 stdint.h en C ++.
De la documentation Boost :
L'en-tête fournit des informations utiles pour ceux du typedef l'écriture de code portable qui EXIGE certaines largeurs entières. Tous les typedef pour sont en augmentation d'espace de noms.
Autres conseils
Il est pas portable, comme les types uint32_t et uint8_t ne font pas partie de la norme C ++. Tous ces maipulations sont intrinsèquement mise en œuvre dépend.
Dans la pratique, oui, il est plus probable d'aller travailler sur la plupart des autres plates-formes que vous rencontrez (surtout si Boost est porté à lui). Toutefois, si vous écrivez ces valeurs emballés dans des fichiers ou des sockets réseau, vous devrez faire face à l'ordre des octets (votre exemple de PowerPC a l'ordre des octets big-endian alors que Intel ont peu endian). À cet égard, le code se comportera différemment sur différentes architectures matérielles.