C Endian Conversão: pouco a pouco
-
06-07-2019 - |
Pergunta
Eu tenho um especial unsigned long (32 bits) e eu preciso converter o endianness dele pouco a pouco -. A minha longa representa várias coisas todos smooshed juntos em um pedaço de binário
Como posso fazê-lo?
Solução
Endianness é um conceito de nível de palavra, onde os bytes são armazenados byte mais significativo primeiro (big endian) ou byte menos significativo primeiro (little endian). Os dados transferidos através de uma rede é tipicamente grande endian (chamada ordem de bytes da rede). Os dados armazenados na memória em uma máquina pode estar em qualquer ordem, com pouco endian sendo o mais comum dada a prevalência da arquitetura Intel x86. Mesmo que a maioria das arquiteturas de computadores são grandes endian, o x86 é tão onipresente que você vai mais frequentemente ver os dados pouco endian na memória.
De qualquer forma, o ponto de tudo isso é que endianness é um conceito muito específico que só se aplica no nível de byte, e não o nível de bit. Se ntohs()
, ntohl()
, htons()
e htonl()
não faça o que você quer, então o que você está lidando com não é endianness per se.
Se você precisar reverter os bits individuais da sua unsigned long ou fazer qualquer outra coisa complicada como essa, por favor poste mais informações sobre o que exatamente você precisa fazer.
Outras dicas
Tenha cuidado para entender o significado de 'ordenação'. Refere-se ao fim de bytes dentro dos dados, não bits dentro do byte. Você só pode precisar usar uma função como htonl ou ntohl para converter seu d-palavra.
Se você realmente quer para inverter a ordem de todos os bits no tipo de dados 32b, você poderia escrever um algoritmo iterativo para mascarar e mudar cada bit na posição apropriada refletida.
A função de conversão endianess simples para um valor a longo sem sinal poderia ser semelhante a seguinte:
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 inverter a ordem de um inteiro bit, você pode mudar os bits em uma direção e mudar os bits para o destino na direção oposta.