将 unsigned char > 255 转换为 int
Posted
技术标签:
【中文标题】将 unsigned char > 255 转换为 int【英文标题】:converting unsigned char > 255 to int 【发布时间】:2015-10-02 11:45:00 【问题描述】:我正在使用 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 在该结构中不存在 我认为byData
很可能是一个可变长度数组。
Why use array size 1 instead of pointer?,但您可能需要阅读该结构的文档以了解如何从中获取数据。
byData 是无符号字符?它在结构中这么说。我什至可以将其更改为unsigned int
,但低于 255 的值会给我错误的信息。
Convert 2 char into 1 int的可能重复
【参考方案1】:
这实际上看起来像一个可变大小的结构,其中最后有一个大小为1
的数组是一种常见的方式。参见例如this tutorial about it.
在这种情况下,1
的值 257
的两个字节都是正确的值。将这两个字节视为 16 位值,并将这些位组合起来。一个字节将成为高字节,其中1
对应于256
,然后添加低字节1
,您就有256 + 1
,当然等于257
。简单的二进制算术。
哪个字节是高位,哪个是低位我们不能说,但是很容易检查您是否可以强制使用包含值 258
的消息,然后一个byte 仍将是 1
,但另一个将是 2
。
如果您知道按位移位和或运算符,如何将其组合成单个无符号 16 位值也很容易:
uint8_t high_byte = ...
uint8_t low_byte = ...
uint16_t word = high_byte << 8 | low_byte;
【讨论】:
ye 我试过了,它说 testValue = 2 testValue2 = 1。好的。它对我有用:) 非常感谢! uint32_t 也可以这样吗? 3个字符? @Bart 当然,但是你需要四个字节,而不仅仅是三个。 :) 哦,对了,因为 16 需要 2,32 需要 4。听起来不错:)。如何将 4 转换为 1 uint32_t? @Bart 是的,没错。但要小心确保消息结构有四个(或两个)字节,否则你会超出范围。以上是关于将 unsigned char > 255 转换为 int的主要内容,如果未能解决你的问题,请参考以下文章
为啥将 unsigned char 用于 RGB 像素数据?
char/unsigned char/int/short 存储范围