Pregunta

Tengo un largo especial sin firmar (32 bits) y necesito convertir su endianness poco a poco, mi largo representa varias cosas que se combinan en una sola pieza binaria.

¿Cómo lo hago?

¿Fue útil?

Solución

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 arquitectura Intel x86. A pesar de que la mayoría de las arquitecturas de computadoras son big endian, el x86 es tan ubicuo que la mayoría de las veces verás datos de little endian 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 al nivel de bytes, no al nivel de bits. Si ntohs () , ntohl () , htons () y htonl () no hacen lo que lo que quieres es que 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.

Otros consejos

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 palabra-d.

Si realmente desea invertir el orden de todos los bits en el tipo de datos 32b, puede escribir un algoritmo iterativo para enmascarar y desplazar 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 bits de un entero, puede desplazar los bits en una dirección y los bits hacia el destino en la dirección opuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top