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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top