little - Conversión C Endian: poco a poco
little endian (4)
Endianness es un concepto de nivel de palabra en el que los bytes se almacenan en bytes más significativos primero (big endian) o bytes menos significativos primero (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 el pequeño endian el más común dada la prevalencia de la arquitectura Intel x86. A pesar de que la mayoría de las arquitecturas de computadora son de gran tamaño, el x86 es tan omnipresente que a menudo verá pequeños datos endian en la memoria.
De todos modos, el punto de todo eso es que la endianidad es un concepto muy específico que solo se aplica en el nivel de bytes, no en el nivel de bits. Si ntohs()
, ntohl()
, htons()
y htonl()
no hacen lo que usted desea, entonces, con lo que está tratando no es endianness per se.
Si necesita revertir los bits individuales de su longitud sin firmar o hacer algo complicado así, publique más información sobre lo que debe hacer exactamente.
Tengo un largo especial sin signo (32 bits) y necesito convertir el carácter endiablado de él poco a poco; mi longitud representa varias cosas, todas juntas en una sola pieza de binario.
¿Cómo lo hago?
Tenga cuidado de comprender el significado de ''endianness''. Se refiere al orden de los bytes dentro de los datos, no a los bits dentro del byte. Puede que solo necesite usar una función como htonl o ntohl para convertir su palabra d.
Si realmente desea invertir el orden de todos los bits en el tipo de datos 32b, podría escribir un algoritmo iterativo para enmascarar y desplazar cada bit a la posición reflejada correspondiente.
Una función de conversión endianess simple para un valor largo sin signo podría ser similar a la siguiente:
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 bits de un entero, puede desplazar los bits en una dirección y desplazar los bits hacia el destino en la dirección opuesta.