我想编写一个函数,其中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'
提前致谢。
答案 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);