Domanda

Ho un long senza segno speciale (32 bit) e ho bisogno di convertirne l'endianità poco a poco - la mia long rappresenta diverse cose tutte messe insieme in un unico binario.

Come posso farlo?

È stato utile?

Soluzione

Endianness è un concetto a livello di parola in cui i byte sono memorizzati per primi byte più significativi (big endian) o byte meno significativi per primi (little endian). I dati trasferiti su una rete sono in genere big endian (il cosiddetto ordine di byte di rete). I dati archiviati in memoria su una macchina possono essere in entrambi gli ordini, con little endian il più comune data la prevalenza dell'architettura Intel x86. Anche se la maggior parte delle architetture di computer sono big endian, l'x86 è così onnipresente che spesso vedrai piccoli dati endian in memoria.

Comunque, il punto di tutto ciò che è l'endianità è un concetto molto specifico che si applica solo a livello di byte, non a livello di bit. Se ntohs () , ntohl () , htons () e htonl () non fanno cosa vuoi quindi quello con cui hai a che fare non è l'endianità in sé.

Se devi invertire i singoli bit del tuo unsigned long o fare qualcos'altro complicato in questo modo, pubblica maggiori informazioni su cosa devi fare esattamente.

Altri suggerimenti

Fai attenzione a capire il significato di "endianness". Si riferisce all'ordine dei byte all'interno dei dati, non ai bit all'interno del byte. Potrebbe essere necessario utilizzare solo una funzione come htonl o ntohl per convertire la tua d-word.

Se si desidera veramente invertire l'ordine di tutti i bit nel tipo di dati 32b, è possibile scrivere un algoritmo iterativo per mascherare e spostare ciascun bit nella posizione riflessa appropriata.

Una semplice funzione di conversione endianess per un valore lungo senza segno potrebbe essere simile alla seguente:

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;
}

Per invertire l'ordine dei bit di un numero intero, è possibile spostare i bit in una direzione e spostare i bit verso la destinazione nella direzione opposta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top