2012-09-04 39 views
5

我正在讀取i2c設備的寄存器,並且返回值的範圍是-32768至32768,帶符號整數。下面是一個例子:Qt將負十六進制字符串轉換爲帶符號整數

# 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超過規定的最大返回值。我需要將十六進制值轉換爲有符號整數,所以我需要將十六進制值視爲用二進制補碼錶示。我沒有在QString文檔中看到一個簡單的方法。我如何在Qt中實現這一點?

注:

的QString :: toShort返回0:

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

對於stringListSplit的[0]等於 '0xfebe',我得到的-322的輸出的輸入,使用所述C-由基思如此回答:

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

回答

3

將結果轉換爲有符號的16位整數。

qDebug() << (int16_t)milAmps; 
+0

永遠不會使用C風格的演員:) – fasked

+0

@fasked:是啊,舊的習慣很難死去......現在放下我的草坪吧! –

+0

非常感謝這似乎工作,但有沒有任何理由這將是不安全/皺眉? – PhilBot

4

您需要將此字符串轉換爲16位整數。這很可能可以使用QString::toShort方法。

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

這打印0.任何想法爲什麼? – PhilBot

+0

如果發生錯誤,'toShort'方法可以返回'0'。你確定'stringListSplit [0]'是正確的字符串嗎? – fasked

+0

可能抱怨輸入超出範圍。您需要將其解析爲整數並將其強制關閉。 –

相關問題