C Endian Conversion: poco a poco

Tengo un largo sin firmar especial (32 bits) y necesito convertir su endianness poco a poco, mi largo representa varias cosas todas juntas en una sola pieza de binario.

¿Cómo lo hago?

Endianness es un concepto a nivel de palabra donde los bytes se almacenan primero en el byte más significativo primero (big endian) o en el primero en el byte menos significativo (little endian). Los datos transferidos a través de una red suelen ser big endian (lo que se denomina orden de bytes de red). Los datos almacenados en la memoria de una máquina pueden estar en cualquier orden, siendo Little Endian el más común, dada la prevalencia de la architecture Intel x86. A pesar de que la mayoría de las architectures de computadoras son big endian, el x86 es tan ubicuo que la mayoría de las veces verás little endian data en la memoria.

De todos modos, el punto de todo esto es que el endianness es un concepto muy específico que solo se aplica a nivel de byte, no a nivel de bit. Si ntohs() , ntohl() , htons() y htonl() no hacen lo que quieres, entonces lo que estás tratando no es endianness per se.

Si necesita revertir los bits individuales de su firma sin firmar o hacer algo más complicado, publique más información sobre lo que debe hacer exactamente.

Tenga cuidado de entender el significado de ‘endianness’. Se refiere al orden de los bytes dentro de los datos, no a los bits dentro del byte. Es posible que solo necesite usar una función como htonl o ntohl para convertir su d-word.

Si realmente desea invertir el orden de todos los bits en el tipo de datos 32b, puede escribir un algoritmo iterativo para enmascarar y cambiar cada bit a la posición reflejada apropiada.

Una función de conversión de endianess simple para un valor largo sin firmar podría tener el siguiente aspecto:

 typedef union { unsigned long u32; unsigned char u8 [ 4 ]; } U32_U8; unsigned long SwapEndian(unsigned long u) { U32_U8 source; U32_U8 dest; source.u32 = u; dest.u8[0] = source.u8[3]; dest.u8[1] = source.u8[2]; dest.u8[2] = source.u8[1]; dest.u8[3] = source.u8[0]; return dest.u32; } 

Para invertir el orden de los bits de un entero, puede desplazar los bits en una dirección y desplazarlos hacia el destino en la dirección opuesta.