Qt将负十六进制字符串转换为有符号整数

5
我正在读取i2c设备的寄存器,返回值的范围是-32768至32768,即有符号整数。以下是一个示例:
# i2cget -y 3 0x0b 0x0a w
0xfec7

在Qt中,我得到了这个值(0xfec7),想要将它作为有符号整数显示在QLabel中。变量stringListSplit [0]是一个值为'0xfec7'的QString。

// Now update the label
int milAmps = stringListSplit[0].toInt(0,16); // tried qint32
qDebug() << milAmps;

问题在于不管我怎么尝试,总是得到无符号整数,所以对于这个例子,我得到了65223,它超过了指定的最大返回值。我需要将十六进制值转换为有符号整数,因此我需要将其视为使用2s补码表示的十六进制值。然而,在QString文档中我没有看到简单的方法。如何在Qt中实现此目的?

注意:

QString::toShort返回0:

// Now update the label
short milAmps = stringListSplit[0].toShort(0,16);
qDebug() << "My new result: " << milAmps;

当输入的stringListSplit[0]等于'0xfebe'时,使用Keith提供的C风格转换,我得到了一个输出为-322。
// Now update the label
int milAmps = stringListSplit[0].toInt(0,16);
qDebug() << "My new result: " << (int16_t)milAmps;
2个回答

4

您需要将此字符串转换为16位整数。很可能可以使用QString::toShort方法。

short milAmps = stringListSplit[0].toShort(0,16); 
qDebug() << milAmps;

toShort 方法如果出现错误可能会返回 0。您确定 stringListSplit[0] 是正确的字符串吗? - fasked
可能是在抱怨输入超出范围了。你需要将其解析为整数并向下转换。 - Keith Randall
是的,如果我使用Keith的C风格转换建议,对于0xfec2我会得到-318。但是如果我使用toShort()方法,它会返回0。 - PhilBot

3
将结果转换为有符号的16位整数。
qDebug() << (int16_t)milAmps;

1
请勿使用 C 风格的强制类型转换 :) - fasked
@fasked:是啊,老习惯难改...现在请离开我的草坪! - Keith Randall
好的,谢谢。这似乎有效,但是有没有什么原因会让它不安全或者不被赞同呢? - PhilBot
1
在C++中,你应该使用static_cast<int16_t>(milAmps)。在这种情况下没有危险,但使用C++转换可以减少意外将字符串转换为整数或其他虚假转换的可能性。 - Keith Randall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接