从QByteArray中删除第一个字节

10

我想编写一个函数,其中 QByteArray 是输入到函数中的参数。 我想从接收到的数据中删除某些头,并将其存储到全局 QByteArray 中。

void abc::CopyData(const QByteArray &data)
{
    switch(RequestPacketCount)
    {
        case REQUEST_FIRST_PACKET:
        {
            ByteArrayData = data;
        }
            break;
        case REQUEST_SECOND_PACKET:
        case REQUEST_THIRD_PACKET:
            ByteArrayData.append(data);
    }
}
我想从"data"的开头移除'n'个字节,并将剩余的数据存储到"ByteArrayData"中。
提前致谢。
3个回答

7

你似乎想要的只是复制原始数组并使用 remove

ByteArrayData = data;
ByteArrayData.remove(0, n);            // Removes first n bytes of ByteArrayData,
                                       // leaving data unchanged

由于QByteArray是隐式共享的,因此复制的构造需要恒定时间,而修改(删除)是在需要时进行实际复制的操作。

要高效地追加,您可以使用data来访问字节数组,并append所需的部分。这将防止不必要的临时对象。代码如下:

ByteArrayData.append(data.data() + n, data.size() - n);

谢谢,但我遇到了以下错误: 错误:将“const QByteArray”作为“QByteArray&QByteArray :: remove(int,int)”的“this”参数传递会丢弃限定符[-fpermissive] - beparas
@beparas 啊,对了,我漏掉了 const。我会更新的。 - Joachim Isaksson
谢谢,append() 函数怎么样? - beparas
@beparas 你的意思是想将数据中除了前n个字节以外的所有内容追加到ByteArrayData中? - Joachim Isaksson
我的CopyData()函数调用了三次,每次'data'都有'n'字节的固定头。你的解决方案对于第一种情况有效,但是如何在上述代码的第二和第三种情况下附加数据(删除头部)呢?谢谢。 - beparas

2
你可以使用 QByteArray::mid 方法:
ByteArrayData = data.mid(n);
//...
ByteArrayData.append(data.mid(n));

0

补充Joachim的回答,在C++中,有些实现细节会泄漏到接口中,但出于性能考虑,最好还是通过按值传递参数让编译器执行复制。因此,换句话说,最好的解决方案是:

void abc::CopyData(QByteArray data)
{
  ...
  data.remove(0, n);
  ...
  ByteArrayData.append(data);
}

你绝对不想让这样的参数通过值传递到信号声明中 - 信号永远不会修改它们的数据。但是,对于一个槽来说修改数据是可以的:

class MyClass : public QObject {
  Q_OBJECT
  ...
public:
  // pass by const reference in signals
  Q_SIGNAL void dataSource(const QByteArray &); // The only correct signal form
  // pass by const reference or value in slots, depending on use
  Q_SLOT void dataSink1(const QByteArray &); // Valid
  Q_SLOT void dataSink2(QByteArray); // Valid as well.
};

连接到任何一个插槽都使用相同的代码,无论是Qt4还是Qt5连接样式。因此,您不必担心由于泄漏的实现细节而导致接口更改破坏您的代码。

// Qt4 - you should elide const and reference anyway
connect(src, SIGNAL(dataSource(QByteArray)), dst, SLOT(dataSink1(QByteArray));
connect(src, SIGNAL(dataSource(QByteArray)), dst, SLOT(dataSink2(QByteArray));
// Qt5
connect(src, &MyClass::dataSource, dst, &MyClass::dataSink1);
connect(src, &MyClass::dataSource, dst, &MyClass::dataSink2);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接