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.
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);
}
.. 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
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.
En recherche d'emploi.