如何将uint8_t转换为uint16_t?
目前我正在将uint16_t分解为uint8_t,如下所示:
packetBuffer.header[0] = ((co2Val>>8) & 0xff);
packetBuffer.header[1] = (co2Val & 0xff);
packetBuffer.header[2] = ((humVal>>8)&0xff);
packetBuffer.header[3] = (humVal & 0xff);
packetBuffer.header[4] = ((tempVal>>8)&0xff);
packetBuffer.header[5] = (tempVal & 0xff);
co2Val,humVal和tempVal都是uint16_t
然而,我需要将它们更改回来以获得相应的值。这在另一端收到uint8_t buf [16]。
这就是我做到的:
CO2Val = (buf[0]<<8)|buf[1];
HumVal = (buf[2]<<8)|buf[3];
HumVal = (HumVal & 0x0fff);
TempVal = (buf[4]<<8)|buf[5];
TempVal = (TempVal & 0x3fff);
结果不同。谁知道为什么?感谢
答案 0 :(得分:2)
如何将uint8_t转换为a uint16_t?
只需指定:
uint8_t val_u8 = ...
uint16_t val_u16 = val_u8;
我认为你想问的问题是“你如何 _ uint_8与uint_16结合?”
<击> 我猜你可能在行
CO2Val = (buf[0]<<8)|buf[1];
如果buf[ 0 ]
是uint8_t
。在进行位移之前将其转换为uint16_t
以确保8位的空间(否则,位将“从MSB边缘”掉落)
uint16_t CO2Val = ( (uint16_t) buf[0] << 8) | buf[1];
击> <击> 撞击>
答案 1 :(得分:1)
我的猜测是你真的使用的是C ++,而不是C,在C中,这不会发生,因为算术操作数总是至少提升到buf[0]<<8
等因为移位大小至少是类型的宽度而表现出不确定的行为。int
。
无论如何,让我们尝试一些更简单,更易读的代码:
packetBuffer.header[0] = co2Val/256;
packetBuffer.header[1] = co2Val;
packetBuffer.header[2] = humVal/256;
packetBuffer.header[3] = humVal;
packetBuffer.header[4] = tempVal/256;
packetBuffer.header[5] = tempVal;
和
CO2Val = buf[0]*256+buf[1];
HumVal = buf[2]%16*256+buf[3];
TempVal = buf[4]%64*256+buf[5];
我已经将HumVal
和TempVal
的高位截断了,但是更好的做法是检查超出范围的值并发出一些错误排序
编辑:由于OP澄清了语言是C,我不确定是什么问题。看来我们仍然缺少信息。或许查看所涉及的缓冲区的转储将提供信息。