donc ce qui suit convertit grands Boutiens aux petitsBoutiens autochtones et conversion automatique
uint32_t ntoh32(uint32_t v)
{
return (v << 24)
| ((v & 0x0000ff00) << 8)
| ((v & 0x00ff0000) >> 8)
| (v >> 24);
}
travaux. comme un charme.
J'ai lu 4 octets à partir d'un gros fichier endian dans char v[4]
et passer dans la fonction ci-dessus
ntoh32 (* reinterpret_cast<uint32_t *> (v))
qui ne fonctionne pas - parce que mon compilateur (VS 2005) convertit automatiquement le grand endian omble chevalier [4] dans un petit boutiste uint32_t quand je fais le casting.
AFAIK, cette conversion automatique ne sera pas portable, donc j'utiliser
uint32_t ntoh_4b(char v[])
{
uint32_t a = 0;
a |= (unsigned char)v[0];
a <<= 8;
a |= (unsigned char)v[1];
a <<= 8;
a |= (unsigned char)v[2];
a <<= 8;
a |= (unsigned char)v[3];
return a;
}
oui le (unsigned char)
est nécessaire. oui c'est chien lent.
il doit y avoir un meilleur moyen. n'importe qui ?
Non, le compilateur du VC ne change pas le boutisme. Aucun autre compilateur non plus. Votre fichier de données peut ne pas avoir l'endianness que vous pensez qu'il fait. Et dire quelque chose est "chien lent" basé sur une hypothèse est une façon horrible d'optimiser. –