[英]uint8_t to uint16_t
如何将 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);
结果是不同的。 有谁知道为什么? 谢谢
你如何将uint8_t转换为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];
我的猜测是你真的使用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,我不确定是什么问题。 看来我们仍然缺少信息。 也许查看所涉及的缓冲区的转储将提供信息。
当您说“您如何将 uint_8 与 uint_16 结合?”时,不确定您的意思。 这句话是什么意思?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.