将QByteArray的特定位转换为int,float double等

时间:2019-02-01 09:03:12

标签: c++ qt qt5

我有一个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时会丢失一些信息,反之亦然。

希望我的解释是可以理解的;)

0 个答案:

没有答案