从QByteArray中删除第一个字节

时间:2014-03-19 05:21:38

标签: qt qbytearray

我想编写一个函数,其中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);
    }
}

我想删除'n'不。从'data'开始的字节,并将剩余数据存储到'ByteArrayData'

提前致谢。

3 个答案:

答案 0 :(得分:5)

您似乎想要的只是复制原始数组并使用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);

答案 1 :(得分:1)

您可以使用QByteArray::mid

ByteArrayData = data.mid(n);
//...
ByteArrayData.append(data.mid(n));

答案 2 :(得分: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);