将 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;
};
ulTimeStamp
给出时间
bQuality
给出true/false(能不能看懂)
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
的数组是一种常见的方式。参见例如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;
我正在使用 PLC 进行编程,并且正在从中读取值。
它给了我 unsigned char
中的数据。没关系,但我的 PLC 中的值可能超过 255。而且由于无符号字符不能给出超过 255 的值,所以我得到了错误的信息。
我从图书馆得到的结构:
struct PlcVarValue
{
unsigned long ulTimeStamp ALIGNATTRIB;
unsigned char bQuality ALIGNATTRIB;
unsigned char byData[1] ALIGNATTRIB;
};
ulTimeStamp
给出时间bQuality
给出true/false(能不能看懂)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
的数组是一种常见的方式。参见例如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;