C 铸造uint8至uint32
我在嵌入式C中转换uint8和uin32时遇到一些问题。下面是我正在使用的代码C 铸造uint8至uint32,c,embedded,xilinx,C,Embedded,Xilinx,我在嵌入式C中转换uint8和uin32时遇到一些问题。下面是我正在使用的代码 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
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?这是因为dt是一个指针,所以当您将其强制转换为uint32时,只需将其地址作为存储在_Recv中的值即可
您应该尝试将其强制转换为uint32\t,然后取消引用:
uint32_t _Recv = *((uint32_t*)dt)
因此,该地址将被解释为指向无符号int的指针
一种更具可读性的方法是通过转换构建价值:
uint32_t _Recv = dt[3]<<24 | dt[2]<<16 | dt[1]<<8 | dt[0];
这也将允许您按照自己的意愿管理endianness。这是因为dt是一个指针,所以当您将其强制转换为uint32时,您只需将其地址作为存储在_Recv中的值即可
您应该尝试将其强制转换为uint32\t,然后取消引用:
uint32_t _Recv = *((uint32_t*)dt)
因此,该地址将被解释为指向无符号int的指针
一种更具可读性的方法是通过转换构建价值:
uint32_t _Recv = dt[3]<<24 | dt[2]<<16 | dt[1]<<8 | dt[0];
这也将允许您按照自己的意愿管理endianness。还有另一种使用memcpy的方法,它独立于机器
memcpy (&_Recv,&dt[0],4);
_Recv=htons(_Recv);
通过这种方式,您可以拥有一个uint8数组,并将任意4个字节强制转换为uint32。还有一种使用memcpy的方式,它与机器无关
memcpy (&_Recv,&dt[0],4);
_Recv=htons(_Recv);
通过这种方式,您可以拥有一个uint8数组,并将任意4个字节强制转换为uint32与dt[3]不同,*uint32_t*dt与dt[3]不同,是endian独立的