笔记——QByteArray与有符号整型(int)之间的相互转换

时间:2021-09-14 01:01:22


关于10进制转换为16进制有符号转换方法:

十六进制转换为有符号的10进制数(-128-127)
第一位做为符号,0为正数,1为负数。
对正数,后7位的值即为数值。
对负数,128减后7位表示的数即为负号后的值。

1110 1100(EC)为负数,后7位的值为6c,即616+12=108,128-108=20,此数为-20
1111 1111(FF)为负数,后7位的值为7f,即7
16+15=127,128-127=1,数为-1
1100 1110(CE)为负数,后7位的值为4e,即416+14=78,128-78=50,此数为-50
1100 1111(CF)为负数,后7位的值为4F,即4
16+15=79,128-79=49,此数为-49

有符号的10进制数(-128-127)转为16进制数

如果是正数,第一位为0
如果是负数,第一位为1
对整数,值转为16进制即可
对负数,128减负数后面的值,转为16进制,与0x80做或运算,即为要求值

-49,负号后面的值是49,128-49=79,79转为16进制为0x4f,0x4f+0x80=cf

一,int转QByteArray

通过QByteArray::number方法进行转换(转换为4位16进制):

int numer = -5;
QByteArray arry2 = QByteArray::number(numer,16); //这里16指转换为16进制
qDebug()<<arry2; //"fffffffb"

二,QByteArray转int

如果是一位的16进制可以直接转换:

QByteArray arr;
arr[0] = 0xfb;
int data =(int) arr[0];
qDebug()<<"data:"<<data; //-5

如果是多位,需要自己进行转换,这里为两位:

QByteArray number;
number[0] = 0xfe;
number[1] = 0xcb;
int num = MainWindow::SignedHex2Int(number);
qDebug()<<num; //-309
int MainWindow::SignedHex2Int(QByteArray array){
QString qnum =array.toHex().data();
int num;
bool ok;
num = qnum.toInt(&ok,16);
if(!(qnum.at(0)>='0'&&qnum.at(0)<='7')){//非正数
num = num & 0x7FFF; //清除符号位
num=32768-num; //反码
num = num * -1; //符号位
}
return num;
}