将 unsigned char > 255 转换为 int

converting unsigned char > 255 to int

我正在使用 PLC 进行编程,并且正在从中读取值。

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

我从图书馆得到的结构:

struct PlcVarValue
{
    unsigned long   ulTimeStamp         ALIGNATTRIB;
    unsigned char   bQuality            ALIGNATTRIB;
    unsigned char   byData[1]           ALIGNATTRIB;
};

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

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

这很好用...直到 ppValues[0]->byData > 255;

当我在数字为 257 时尝试以下操作时:

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

输出是testvalue = 1testvalue2 = 1

这对我来说没有意义。

所以我的问题是,我怎样才能解决这个问题,以便它给我正确的号码?

这实际上看起来像一个可变大小的结构,其中在末尾有一个大小为 1 的数组是一种常见的方式。参见例如this tutorial about it.

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

哪个字节是高,哪个是低我们不能说,但是很容易检查是否可以强制包含值[=19的消息=] 相反,因为那时一个字节仍然是 1 但另一个字节将是 2.

如果您知道位移和或运算符,如何将其组合成一个无符号的 16 位值也很容易:

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