2009-08-17 23 views
9

Questa domanda è fondamentalmente la seconda metà di mia altra QuestionConversione di un valore UINT16 in un array UINT8 [2]

Come posso convertire un valore UINT16, in un UINT8 * array senza un ciclo ed evitando problemi di Endian.

Fondamentalmente voglio fare qualcosa di simile:

UINT16 value = 0xAAFF; 
UINT8 array[2] = value; 

Il risultato finale di questo è di memorizzare il valore in una matrice di UINT8 evitando la conversione endian.

UINT8 * mArray; 
memcpy(&mArray[someOffset],&array,2); 

Quando faccio semplicemente memcpy con il valore UINT16, lo converte in little-endian che rovina l'uscita. Sto cercando di evitare l'uso di funzioni di conversione endian, ma penso che potrei essere solo sfortunato.

risposta

25

Come su

UINT16 value = 0xAAFF; 
UINT8 array[2]; 
array[0]=value & 0xff; 
array[1]=(value >> 8); 

Questo dovrebbe fornire lo stesso risultato indipendentemente endianness.

Oppure, se si vuole utilizzare un inizializzatore array:

UINT8 array[2]={ value & 0xff, value >> 8 }; 

(Tuttavia, questo è possibile solo se value è una costante.)

0

Un cast temporanea per UINT16 * dovrebbe farlo:

((UINT16*)array)[0] = value; 
+1

Questo non funziona perché è ancora sensibile alle endianness (in pratica, si fa la stessa cosa come il 'memcpy' in questione). Il tag di domanda –

7

Non c'è bisogno per la compilazione condizionale. È possibile eseguire lo spostamento di bit per ottenere il byte più alto e più basso del valore:

uint16_t value = 0xAAFF; 
uint8_t hi_lo[] = { (uint8_t)(value >> 8), (uint8_t)value }; // { 0xAA, 0xFF } 
uint8_t lo_hi[] = { (uint8_t)value, (uint8_t)(value >> 8) }; // { 0xFF, 0xAA } 

I calchi sono opzionali.

+2

è C++, usa i cast di C++. –

4

Supponendo che si desidera avere l'alta ordine byte sopra il byte di ordine inferiore nella matrice:

array[0] = value & 0xff; 
array[1] = (value >> 8) & 0xff; 
+2

la maschera '0xff' non è necessaria: la conversione da interi a 16 bit a 8 bit farà cadere il byte più alto (la conversione senza segno è ben definita!) – Christoph

+2

È vero, ma generalmente maschera tutto per chiarezza. A volte, farò anche un po 'di spostamento di 0 in modo che le linee siano tutte uguali e abbiano un bell'aspetto verticale. Qualsiasi buon compilatore ottimizzerà le affermazioni inutili, e vale la pena chiarire. – Jonathan

1
union TwoBytes 
{ 
    UINT16 u16; 
    UINT8 u8[2]; 
}; 

TwoBytes Converter; 
Converter.u16 = 65535; 
UINT8 *array = Converter.u8; 
+1

Questo è sensibile a endianness. – Jonathan

0

ho usato questa discussione a dev Elop una soluzione che estende le matrici di varie dimensioni:

UINT32 value = 0xAAFF1188; 
int size = 4; 
UINT8 array[size]; 

int i; 
for (i = 0; i < size; i++) 
{ 
    array[i] = (value >> (8 * i)) & 0xff; 
} 
Problemi correlati