2013-12-20 73 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