将无符号字符> 255 转换为 int

converting unsigned char > 255 to int

本文关键字:转换 int gt 无符号 字符      更新时间:2023-10-16

我正在用PLC编程,并从中读取值。

它给了我unsigned char中的数据。这很好,但我的PLC中的值可以超过255。由于无符号字符不能给出超过255的值,所以我得到了错误的信息。

我从图书馆得到的结构:

struct PlcVarValue
{
    unsigned long   ulTimeStamp         ALIGNATTRIB;
    unsigned char   bQuality            ALIGNATTRIB;
    unsigned char   byData[1]           ALIGNATTRIB;
};
  • ulTimeStamp给出时间
  • bQuality给出真/假(是否能够读取(
  • CCD_ 4给出了数据

无论如何,我现在正在尝试:(其中ppValuesPlcVarValue的对象(

    unsigned char* variableValue =  ppValues[0]->byData;            
    int iVariableValue = *variableValue;

这很好。。。直到CCD_ 7>255;

当我尝试以下数字时,例如257:

unsigned char testValue = ppValues[0]->byData[0];
unsigned char testValue2 = ppValues[0]->byData[1];

输出为testvalue = 1testvalue2 = 1

这对我来说没有意义。

所以我的问题是,我如何解决这个问题,让它给我正确的数字?

这实际上看起来像一个可变大小的结构,在末尾有一个1大小的数组是一种常见的方法。例如,请参阅本教程。

在这种情况下,作为值2571的两个字节都是正确的值。将这两个字节想象成一个16位的值,然后组合这些位。一个字节将成为高字节,其中1对应于256,然后加上低字节,即1,得到256 + 1,当然等于257。简单的二进制运算。

哪个字节是高字节,哪个是低字节,我们不能说,但很容易检查是否可以强制使用包含值258的消息,因为这样一个字节仍然是1,但另一个字节将是2

如果你知道按位移位和/或运算符,那么如何将其组合为一个无符号的16位值也很容易:

uint8_t high_byte = ...
uint8_t low_byte = ...
uint16_t word = high_byte << 8 | low_byte;