QByteArray 转为 int 详细说明
QByteArray有提供toInt()函数将 QbyteArray中的数据转为int类型。文章中涉及到的int类型都是4个字节。
toInt()用法:
一、QByteArray保存的是字符串,直接调用 toInt() 就可以了。需要注意的是不能超出int类型的大小范围,不然会转换失败。
- 保存的是十进制的数
输出:bool ok; QByteArray arr("12345"); qDebug() << arr.toInt(&ok, 10); QByteArray arr1("-12345"); qDebug() << arr1.toInt(&ok, 10);
如果超出了int的范围:12345 -12345
输出:bool ok = false; QByteArray arr("123451111111111111"); qDebug() << arr.toInt(&ok, 10) << ok;
0 false
- 保存的是十六进制的数:
输出:bool ok; QByteArray arr("ABCDEF"); qDebug() << arr.toInt(&ok, 16);
当然不能超过7FFFFFFF,否则会转换失败:11259375
输出:bool ok = false; QByteArray arr("80000000"); qDebug() << arr.toInt(&ok, 16) << ok;
0 false
二、QByteArray保存的是数,需要先调用toHex() 再调用 toInt(),这种方法也不能超出int范围。但是这种方法只能正确转换16进制的数。
bool ok;
QByteArray arr;
arr[0] = 0xAB;
arr[1] = 0xCD;
arr[2] = 0xEF;
qDebug() << arr.toHex().toInt(&ok, 16);
输出:
11259375
三、自定义方法
这种方法比较灵活。
enum Endian
{
LittileEndian,
BigEndian
};
int byteAraryToInt(QByteArray arr, Endian endian = BigEndian)
{
if (arr.size() < 4)
return 0;
int res = 0;
// 小端模式
if (endian == LittileEndian)
{
res = arr.at(0) & 0x000000FF;
res |= (arr.at(1) << 8) & 0x0000FF00;
res |= (arr.at(2) << 16) & 0x00FF0000;
res |= (arr.at(3) << 24) & 0xFF000000;
}
// 大端模式
else if (endian == BigEndian)
{
res = (arr.at(0) << 24) & 0xFF000000;
res |= (arr.at(1) << 16) & 0x00FF0000;
res |= arr.at(2) << 8 & 0x0000FF00;
res |= arr.at(3) & 0x000000FF;
}
return res;
}
测试:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QByteArray arr;
arr[0] = 0x8F;
arr[1] = 0xAB;
arr[2] = 0xCD;
arr[3] = 0xEF;
qDebug() << "arr to int: " << bytesToInt(arr);
return a.exec();
}
输出:
arr to int: -1884566033