- QByteArray从名字上看是字节数组,但它里面实际上是以字符数组的形式存储数据的。
QByteArray a;
a[0] = 0xff;
a[1] = 0xff;
a[2] = 0xa1;
a[3] = 0x89;
qDebug() << a.size();
qDebug() << a;
- 我们看到a中存储的是字节型数据,大小为4
QByteArray b = a.toHex();
qDebug() << b.size();
qDebug() << b;
- 将a转化为16进制后,大小竟然为8了,此时每个数都是按ASCII字符存储的。
- 下面我想把0xffffa189这个补码表示的数转化为原码,发现这两种转换方式都转换失败???????
- 仔细想了想发现转换失败是有道理的,int是4字节的数,现在把一个8字节b按照ASCII表示的数转换为int,肯定超出了int的取值范围。那a为什么错呢?a明明是4字节的补码。这一点我也没想明白?
int d = a.toInt(&ok,16);
int d1 = b.toInt(&ok,16);
qDebug() << d << " " << d1;
- 按照下面c2的方法能够实现补码到原码之间的转换。a的转换失败了,b转换成unsigned int 后输出,结果是无符号的32位数。用第三种方法,先将b转换成无符号数4294943113,这个数很大,符号位是1,但我们记为无符号数。然后我们把它赋给有符号的c2,这个时候转化就是正确的了。
- 也不知道为什么a为负值时都没法转化,先这样用着吧。
bool ok;
unsigned int c = a.toUInt(&ok,16);
unsigned int c1 = b.toUInt(&ok,16);
int c2 = b.toUInt(&ok,16);
qDebug() << c << " " << c1 << " " << c2;