将无符号字符> 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;
};
ulTimeStamp
给出时间bQuality
给出真/假(是否能够读取(- CCD_ 4给出了数据
无论如何,我现在正在尝试:(其中ppValues
是PlcVarValue
的对象(
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 = 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;
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 将 int 数组转换为 std::vector<int*>
- 如何转换 int 变量并附加到常量 wchar_t*
- 类型转换<int>的舍入问题
- 在Objective-C中调用sqlite3数据库时,如何调用和转换int/NSNumber
- 转换 int -> 无符号长 长 是否由标准定义
- 简单的 int 到字符串转换..int to const char* 无效
- 如何将转换 int 除法键入为浮点数
- C++类型转换 int * 到类
- 预期的类型说明符,并且无法在初始化时转换“int*”
- 转换int并将其与char*连接
- 字符串流在转换int型时添加新行
- 转换int为字符串/char c++ /Arduino
- c# P-Invoke:如何转换INT fun(BYTE *bStream, UINT16 *nCount, const
- 类型转换(int**)和int(*)的区别
- 从"int"到"nodeType"的无效转换<int>
- 从无符号int构造对强制转换int的引用