两字节转换成一个16位int

在做通信协议解析时,需要用两个字节来表示一个值,0X9985小端模式下表示为0X8599,用计算机算出来等于34201,为什么在QT中代码实现就变成了-31335,一直搞不明白是为什么,请大家帮忙看看是我程序哪里错了吗,一直搞不明白是为什么

img

用qt编程的话,建议可以用qt定义的类型,比如这边用quint16,就可以很容易知道是无符号的两个字节。
以及这边再推荐可以使用QtEndian的转换方法

#include <QtEndian>

const unsigned char b[2] = {0x99, 0x85};
quint16 result = qFromLittleEndian<quint16>(b);
qDebug() << result;

打印结果34201

short是有符号的

#include <stdio.h>
 
int main()
{
    short s = -31335;
    char *p = (char *)&s;
    printf("%x %x", *p, *(p+1));
    return(0);
}

99 85
由此可知,你首先不应该小端,其次,用unsigned short

【相关推荐】




如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^