2013-12-20 74 views
1
我有一些麻煩鑄造UINT8和uin32嵌入式C.這裏

是我使用的代碼...鑄造UINT8 UINT32到

int b = 0; 
u8 dt[4] = {0}; 
while (there_is_buffer(rbuf)) { 
    dt[b] = (u8)(popFront(rbuf)); 
    if (b > 2) { 
     uint32_t _Recv = (uint32_t)dt; 

     /*  xil_printf("data: %x%x%x%x\n\r",dt[3], dt[2], dt[1], dt[0]); */ 
     xil_printf("data: %x\n\r", _Recv); 
     b = 0; 
    } 
    else 
     b++; 
} 

被註釋掉工作正常printf語句,但其他一個沒有。我在這裏做錯了什麼?我如何將u8數組轉換爲uint32?

回答

7

這是因爲dt是一個指針,因此當您將它投射到uint32_t時,您只需將其地址作爲將存儲在_Recv中的值。

你應該嘗試強制轉換爲uint32_t,然後取消對它的引用:

uint32_t _Recv = *((uint32_t*)dt) 

,這樣的地址將被解釋爲一個指向unsigned int

更具可讀性的方法是用轉移到構建價值:

uint32_t _Recv = dt[3]<<24 | dt[2]<<16 | dt[1]<<8 | dt[0]; 

這也將讓您管理字節序如你所願。

+1

的'*((uint32_t的*)DT)'是尾數獨立不像'dt的[3] << 24 | dt [2] << 16 ...'方法(正如你所提到的)。但第一個是受到對齊訪問問題的影響。第二個依賴於sizeof(int)> = 4。 – chux

0

使用memcpy還有另外一種方法,它與機器無關。

memcpy (&_Recv,&dt[0],4); 
_Recv=htons(_Recv); 

這種方式可以有UINT8的陣列,並且施放任何4個字節來UINT32