2009-08-17 1649 views
9

這個問題基本上是下半年我的其他Question轉換一個UINT16值轉換成UINT8數組[2]

我怎麼能轉換UINT16值,爲UINT8 *陣列沒有一個循環,並避免端的問題。

基本上我想這樣做:

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

的這最後的結果是到值存儲到一個UINT8陣列,同時避免端序轉換。

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

當我簡單地做的memcpy與UINT16值,將其轉換成little-endian的這破壞了輸出。我試圖避免使用endian轉換函數,但認爲我可能只是運氣不好。

回答

25

如何

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

這應該產生相同的結果獨立字節序。

或者,如果你想使用數組初始化:

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

(然而,這僅僅是可能的,如果value是一個常數。)

0

一個臨時演員到UINT16 *應該這樣做:

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

這不起作用,因爲它仍然對字節序(對於問題中的'memcpy'做的事情是一樣的)。 – 2009-08-17 17:40:23

7

沒有必要條件編譯。您可以通過位移來獲取數值的較高和較低字節:

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 } 

這些轉換是可選的。

+2

問題標籤是C++,使用C++ casts。 – 2009-08-17 18:54:09

4

假設你想擁有高階在陣列中的低字節以上字節:

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

掩碼0xff是不必要的:從16位整數到8位整數的轉換將會丟棄高位字節(無符號轉換是明確定義的!) – Christoph 2009-08-17 17:47:21

+2

這是真的,但我通常會爲了清晰起見而掩蓋所有內容。有時候,我甚至會進行0位換位,這樣所有的行都匹配起來,並且垂直看起來不錯。任何優秀的編譯器都會優化不必要的語句,這非常值得澄清。 – Jonathan 2009-08-18 13:31:46

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

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

這對排序很敏感。 – Jonathan 2009-08-18 13:32:39

0

我用這個螺紋到dev elop一個跨越多種大小的數組的解決方案:

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

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