我有一个QByteArray,在QByteArray内有多个要提取的不同数据类型的值。困难在于,这些值具有定义的x位长度,并且具有定义的起始位置(也以位为单位)。
例如:int8从nr位存储在QByteArray内部。第一个字节的4位到nr位。 12(在第二个字节内)。
在Qt维基方面,我找到了一种将byteArray分解为位数组的方法:https://wiki.qt.io/Working_with_Raw_Data
所以我要像这样从字节数组中切出一些位:
QByteArray MyCutter::cutMessage(qint32 bitStart, qint32 bitLength)
{
qDebug() << mBuffer;
QBitArray bits(mBufferLen * 8);
for(quint32 i=0; i<mBufferLen; ++i)
{
for(quint32 b=0; b<8; b++)
{
bits.setBit(i*8 +b, mBuffer.at(i) & (1<<(7-b)));
}
}
qDebug() << bits;
QByteArray bytes;
//round up to the next n*8 length of a byte: (length + y) = x*8
qint32 bitLengthWithZeros = (bitLength + (8 - 1)) & ~(8 - 1);
bytes.resize(bitLengthWithZeros/8);
bytes.fill(0);
for(qint32 b=bitStart ,c=0; b<(bitStart + bitLength); b++, c++)
{
bytes[c/8] = (bytes.at(c/8) | ((bits.testBit(b)?1:0)<<(7-b%8)));
}
qDebug() << bytes;
return bytes.data();
}
到目前为止,一切正常-我可以将ByteArray切成其他任何一个。 问题是将这些值转换为int / float / doubles,更具体地说,将其转换为带符号的值。
要进行转换,我尝试了两件事:
QByteArray :: toHex()。toLong(nullptr,16)... toLong / toLongLong等。此方法有效,但仅返回QByteArray的UNSIGNED值。如果要像上面的示例一样,使用函数MyCutter::cutMessage
剪切mBuffer,请从4.位到12位(也为0xFF),则我将得到255的有符号整数!那是错的吗?
另一方面,我尝试使用QStremData进行转换:
QDataStream stream(mBuffer);
stream.setByteOrder(QDataStream::LittleEndian);
qint64 result;
stream >> result;
qDebug() << QString::number(result,16);
qDebug() << QString::number(result);
mBuffer是原始数据。如果将"\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
插入insde mBuffer,则打印值为-1,这是正确的。
QByteArray h = cutMessage(0,8);
qDebug() << h.toHex().toLongLong(nullptr, 16);
QDataStream stream2(h);
stream2.setByteOrder(QDataStream::LittleEndian);
qint64 result2;
stream2 >> result2;
qDebug() << QString::number(result2,16);
qDebug() << QString::number(result2);
使用上面的代码块转换cut-Message总是返回“ 0”。
因此,如果不进行剪切,则整个QByteArray的解释都是正确的,但是如果我剪切掉某些东西,它将始终返回无符号值或“ 0”。
以某种方式,我在转换为QBitArray时会丢失一些信息,反之亦然。
希望我的解释是可以理解的;)