[英]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;
};
ulTimeStamp
给出了时间 bQuality
给出真/假(能否读取或不读) byData[1]
给出了数据。 反正我现在尝试此:(其中ppValues
是一个对象PlcVarValue
)
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 = 1
, testvalue2 = 1
这对我没有意义。
所以我的问题是,我怎样才能解决这个问题,以便给出正确的数字?
这实际上看起来像一个可变大小的结构,其中最后有一个大小为1
的数组是获得它的常用方法。 参见例如本教程 。
在这种情况下,值257
两个字节都是1
是正确的值。 将这两个字节视为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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.