ça ma parait douteux ton truc de "char seulement" mais bon...
Code :
- /* Convention : sur le réseau c'est du little-endian */
- template<typename T>
- void swapEndian(T& data)
- {
- #ifdef BIG_ENDIAN
- char* const p = static_cast<char*>(&data);
- for (int i=0 ; i<sizeof(T)/2 ; i++)
- std::swap(p, p[sizeof(T) - 1 - i]);
- #endif
- }
- void decompose(float f)
- {
- swapEndian(f);
- memcpy(rep, &f, sizeof(f));
- }
- float recompose(void)
- {
- float f;
- memcpy(&f, rep, sizeof(f));
- swapEndian(f);
- return f;
- }
|
attention à l'endian-dependance et à l'implantation de [i]float. Toutes les archis ne sont pas IEEE-754 et float ne fait pas toujours 32-bits. Avec ce code, si le client est x86 et le serveur MIPS ça risque de pas trop marcher.
edit : je t'ai ajouté un petit endian-swapper, en supposant que la macro BIG_ENDIAN n'est définie que sur une archi big-endian (mips, power-pc...)
Message édité par jesus_christ le 23-10-2005 à 21:46:28