Partage
  • Partager sur Facebook
  • Partager sur Twitter

Endian (les petits et les grand indiens)

Alternative à htonl() et ntohl()

Sujet résolu
    14 août 2019 à 8:41:02

    Bonjour,

    Je suis toujours à la découverte du C++ moderne et de la lib standard.

    Aujourd'hui, j'ai un problème d' "Endianess". Dans mon fichier, les données doivent être en "Big Endian", mon PC est en "Litlle Endian"!

    Je me suis bricolé une procédure (à base de ">>" et de "&0xFF") qui me transforme les int en vector<uint8_t> en litlle/big Endia!.

    Mais, il y a sûrement mieux. En particulier, il est classique d'utiliser htons(), ntohs(), htonl() et ntohl(), mais il ne sont pas dans la lib standard.

    Y-a-t'il d'autre alternative ?

    Bien cordialement.

    • Partager sur Facebook
    • Partager sur Twitter
      14 août 2019 à 11:20:21

      Si tu es sous un système POSIX, il existe des fonctions ntoh*()/hton*(). Souvent je me rajoute une couche de surcharge pour me simplifier la vie.

      En tout cas, c'est ce qu'il faut privilégier (net to host / host to net), et ne pas chercher à savoir si ton hote est big ou little.

      Si tu as besoin de portabilité, regarde si ce n'est pas dans boost ou des lib réseau/de sérialisation que tu utiliserai déjà.

      Sinon, il me semble avoir vu des propositions sur le sujet pour je ne sais plus quelle version du langage.

      PS: passer par un vecteur ne sera pas efficace. Nous sommes dans un des cas valide de reinterpret cast.

      -
      Edité par lmghs 14 août 2019 à 11:24:17

      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        15 août 2019 à 12:49:29

        Bonjour,

        J'évite d'utiliser les hton() pour des problèmes de conversion pour les petits et grands terminant.
        Avec 2 fonctions vites faites (et qui ne dépendent pas de l'endianess local), on travaille directement dans les buffers au moment de la réception ou de l'émission.

        template<typename I>
        inline std::size_t fromBigEndian( I& val , const std::uint8_t* frame ) {
        	std::size_t  sz = sizeof(I);
        	val = *frame++;
        	while ( --sz ) {
        		val = (val << 8) | *frame++;
        	}
        	return  sizeof(I);
        }
        template<typename I>
        inline std::size_t toBigEndian( std::uint8_t* frame, I val ) {
        	std::size_t  sz = sizeof(I);
        	frame += sz;
        	while ( sz-- ) {
        		*--frame = static_cast<uint8_t>(val);
        		val >>= 8;
        	}
        	return  sizeof(I);
        }
        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

          16 août 2019 à 11:51:44

          Bonjour et merci pour ces réponses.

          lmghs a écrit:

          .. Si tu as besoin de portabilité, regarde si ce n'est pas dans boost ou des lib réseau/de sérialisation que tu utiliserai déjà...

          Je n'ai pas encore le réflexe de regarder dans boost! Je viens de l'installer, (... c'est ce qui m'a pris un peu de temps, et donc à retarder ma réponse) et en effet il implémente un ntohX() et htonX() Merci pour l'info.

          Dalfab a écrit:

          ...Avec 2 fonctions vites faites (et qui ne dépendent pas de l'endianess local), on travaille directement dans les buffers au moment de la réception ou de l'émission...

          Moi aussi je me suis fait mes fonctions read/write buffer. mais j'avouse Tes templates sont bien mieux que mes procédures!

          Merci pour ces réponses.

          Bien cordialement.

          Edit: Je n'avais pas vu ta signature, Dalfab. Il y en a qui ont de l'humour! ... "trop convivial !" ...

          -
          Edité par Dedeun 16 août 2019 à 12:01:53

          • Partager sur Facebook
          • Partager sur Twitter

          Endian (les petits et les grand indiens)

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown