GNU/Linux >> Tutoriels Linux >  >> Linux

Prise en charge Big Endian et Little Endian pour l'ordre des octets

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.


Linux
  1. Bash For Loop Guide et exemples

  2. RedHat et SUSE ont annoncé le retrait de la prise en charge d'OpenLDAP

  3. Medleytext - Une application de prise de notes intuitive et élégante pour les programmeurs

  4. Le défi et la promesse du Big Data

  5. Code pour malloc et gratuit

Prise en charge de Tmux, Term et 256 couleurs ?

Un grand changement pour Samba dans Ubuntu 22.04 et comment le contourner

Exemple de point d'arrêt GDB pour C - Définir, afficher, continuer et supprimer des points d'arrêt

Interface ruban pour GTK et Qt

Quelle est la différence entre un tiret et deux tirets pour les paramètres d'invite de commande ?

Quelle est la taille (en bits) d'un UID Unix ?