Sto leggendo i registri di un dispositivo i2c e l'intervallo del valore di ritorno è compreso tra -32768 e 32768, numeri interi con segno. Di seguito è riportato un esempio:Qt Converti stringa esadecimale negativa a numero intero con segno
# i2cget -y 3 0x0b 0x0a w
0xfec7
In Qt, ottengo questo valore (0xfec7) e si desidera visualizzare in un QLabel come intero con segno. La variabile stringListSplit [0] è una QString con il valore '0xfec7'.
// Now update the label
int milAmps = stringListSplit[0].toInt(0,16); // tried qint32
qDebug() << milAmps;
Il problema è non importa quello che provo ottengo sempre numeri interi senza segno, quindi per questo esempio sto ottenendo 65223 che eccede il valore massimo ritorno specificato. Ho bisogno di convertire il valore esadecimale in un intero con segno, quindi devo considerare il valore esadecimale come espresso con il complemento 2s. Non vedo un metodo semplice nella documentazione di QString. Come posso ottenere questo in Qt?
NOTA:
QString :: toShort restituisce 0:
// Now update the label
short milAmps = stringListSplit[0].toShort(0,16);
qDebug() << "My new result: " << milAmps;
Per un ingresso di stringListSplit [0] uguale a '0xfebe', ottengo una potenza di -322, utilizzando il C- fusione stile risposto con Keith in questo modo:
// Now update the label
int milAmps = stringListSplit[0].toInt(0,16);
qDebug() << "My new result: " << (int16_t)milAmps;
non usare mai il casting in stile C :) – fasked
@fasked: Sì , le vecchie abitudini sono dure a morire ... Ora scendi dal mio prato! –
bene, grazie, sembra funzionare, ma c'è qualche ragione per cui questo sarebbe pericoloso/accigliato? – PhilBot