将 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] 提供数据。

无论如何我现在正在尝试这个:(其中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 在该结构中不存在 我认为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 像素数据?

如何将unsigned char 转化为int

char/unsigned char/int/short 存储范围

unsigned char 和 signed char

如何将 unsigned char[] 转换为 std::vector<unsigned char>

为何signed char和unsigned char x=-1printf("%d\n",x)