转换unsigned char> 255到int

时间:2015-10-02 11:45:00

标签: c++ char unsigned-char

我正在使用PLC进行编程,而我正在读取它的值。

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

我从图书馆得到的结构:

struct PlcVarValue
{
    unsigned long   ulTimeStamp         ALIGNATTRIB;
    unsigned char   bQuality            ALIGNATTRIB;
    unsigned char   byData[1]           ALIGNATTRIB;
};
  • ulTimeStamp给出时间
  • bQuality给出了真/假(能否阅读)
  • byData[1]提供数据。

无论如何我现在正在尝试:(其中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 个答案:

答案 0 :(得分:3)

实际上看起来像一个可变大小的结构,其中最后有一个大小为1的数组是获得它的常用方法。参见例如this tutorial about it

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

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

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

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