我想编写一个将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‘no。从' data‘开始的字节数,并将剩余数据存储到'ByteArrayData’中
提前谢谢。
发布于 2014-03-19 13:29:06
您似乎想要的是简单地复制原始数组并使用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);
发布于 2014-03-19 15:06:33
您可以使用QByteArray::mid
ByteArrayData = data.mid(n);
//...
ByteArrayData.append(data.mid(n));
发布于 2014-03-19 23:29:09
除了约阿希姆的回答,在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);
https://stackoverflow.com/questions/22496928
复制相似问题