uint8_t到uint16_t

时间:2010-10-24 04:19:15

标签: c

如何将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);

结果不同。谁知道为什么?感谢

2 个答案:

答案 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,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,我不确定是什么问题。看来我们仍然缺少信息。或许查看所涉及的缓冲区的转储将提供信息。