Conversión de valores flotantes de big endian a little endian

¿Es posible convertir float de grande a pequeño endian? Tengo un gran valor endian de una plataforma PowerPC que estoy enviando a través de TCP a un proceso de Windows (little endian). Este valor es float , pero cuando memcpy el valor en un tipo flotante Win32 y luego llamo a _byteswap_ulong en ese valor, ¿siempre obtengo 0.0000?

¿Qué estoy haciendo mal?

simplemente invierta los cuatro bytes funciona

 float ReverseFloat( const float inFloat ) { float retVal; char *floatToConvert = ( char* ) & inFloat; char *returnFloat = ( char* ) & retVal; // swap the bytes into a temporary buffer returnFloat[0] = floatToConvert[3]; returnFloat[1] = floatToConvert[2]; returnFloat[2] = floatToConvert[1]; returnFloat[3] = floatToConvert[0]; return retVal; } 

Encontré algo más o menos así hace mucho tiempo. Era bueno para una risa , pero ingiera bajo su propio riesgo. Ni siquiera lo he comstackdo:

 void * endian_swap(void * arg) { unsigned int n = *((int*)arg); n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); *arg = n; return arg; } 

Aquí hay una función que puede invertir el orden de bytes de cualquier tipo.

 template  T bswap(T val) { T retVal; char *pVal = (char*) &val; char *pRetVal = (char*)&retVal; int size = sizeof(T); for(int i=0; i 

No inserte los datos directamente en un tipo flotante. Guárdelo como datos de char , intercambie los bytes y luego trátelo como un flotador.

Podría ser más fácil usar el ntoa y las funciones relacionadas para convertir de red a host y de host a red … la ventaja sería que sería portátil. Aquí hay un enlace a un artículo que explica cómo hacerlo.

Este valor es flotante, pero cuando “memcpy” el valor en un tipo flotante win32 y luego llamo a _byteswap_ulong en ese valor, siempre obtengo 0.0000?

Esto debería funcionar. ¿Puedes publicar el código que tienes?

Sin embargo, si le importa el rendimiento (quizás no, en ese caso puede ignorar el rest), debería ser posible evitar memcpy, ya sea cargándolo directamente en la ubicación de destino e intercambiando los bytes allí, o usando un intercambio. que hace el intercambio mientras se copia.

Una buena manera de llegar al valor es usar struct.pack / unpack.
Puede usar el caracter “>” en el formato para indicar que los bytes están en reversa (big endian).

 from struct import unpack, pack sebytes = '\xc8\x00\x00\x00' print unpack('l', sebytes) bebytes = '\x00\x00\x00\xc8' print unpack('>l', bebytes) 

salida:

 (200,) (200,)