繁体   English   中英

uint8_t 到 uint16_t

[英]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,并且由于移位大小至少是类型的宽度, buf[0]<<8等表现出未定义的行为。 在C中,这不会发生,因为算术操作数总是至少提升为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];

我已经留下了截断HumValTempVal ,但是更好的做法是检查超出范围的值并发出某种错误。

编辑:由于OP澄清语言是C,我不确定是什么问题。 看来我们仍然缺少信息。 也许查看所涉及的缓冲区的转储将提供信息。

当您说“您如何将 uint_8 与 uint_16 结合?”时,不确定您的意思。 这句话是什么意思?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM