2009-08-17 16 views
9

To pytanie jest w zasadzie druga połowa na inne moje QuestionKonwersja wartość uint16 do tablicy Uint8 [2]

Jak mogę przekonwertować wartość uint16, w Uint8 * array bez pętli i unikanie endian problemy.

Zasadniczo chcę zrobić coś takiego:

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

Rezultatem tego jest przechowywanie wartości do tablicy Uint8 unikając endian konwersji.

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

Kiedy ja po prostu zrobić memcpy z wartością uint16, konwertuje do ostrokońcej który psuje wyjście. Próbuję uniknąć używania funkcji konwersji endian, ale myślę, że mogę po prostu mieć pecha.

Odpowiedz

25

Jak o

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

ten powinien dostarczyć ten sam wynik niezależnie od endianness.

Albo, jeśli chcesz używać inicjatora tablicy:

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

(Jest to jednak możliwe tylko wtedy, gdy value jest stała.)

0

tymczasowy oddanych do uint16 * należy zrobić:

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

To nie działa, ponieważ nadal jest wrażliwe na endianness (w zasadzie robi to samo, co "memcpy" w pytaniu). –

7

Nie ma potrzeby kompilacji warunkowej. Można przesunąć bit, aby uzyskać wyższy i mniejszy bajt wartości:

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 } 

Rzuty są opcjonalne.

+2

tag zapytania to C++, użyj C++ rzutów. –

4

Zakładając, że chcesz mieć wysoką zamówienie bajt powyżej bajtu niższego rzędu w tablicy:

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

maska ​​'0xff' jest niepotrzebna: konwersja z 16 do 8-bitowych liczb całkowitych spadnie wyższy bajt (unsigned konwersji jest dobrze zdefiniowany!) – Christoph

+2

to prawda, ale ja generalnie zamaskować wszystko dla jasności. Czasami zrobię nawet przesunięcie bitowe o 0, aby wszystkie linie pasowały do ​​siebie i wyglądały dobrze pionowo. Każdy dobry kompilator zoptymalizuje niepotrzebne stwierdzenia i jest wart uwagi. – Jonathan

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

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

To jest wrażliwe na endianness. – Jonathan

0

kiedyś ten wątek dev elop rozwiązanie, które obejmuje tablice wielu rozmiarów:

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

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