Qt 从QByteArray中删除第一个字节
我想写一个函数,其中QByteArray是该函数的输入。 我想从接收数据中删除一些头并将其存储到全局QByteArray中Qt 从QByteArray中删除第一个字节,qt,qbytearray,Qt,Qbytearray,我想写一个函数,其中QByteArray是该函数的输入。 我想从接收数据中删除一些头并将其存储到全局QByteArray中 void abc::CopyData(const QByteArray &data) { switch(RequestPacketCount) { case REQUEST_FIRST_PACKET: { ByteArrayData = data; } b
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'中
提前谢谢 您似乎只需要复制原始数组并使用 由于QByteArray是隐式共享的,因此副本的构造需要恒定的时间,修改(删除)是在需要时生成实际副本的过程 为了有效地追加,您可以使用来获取字节数组和所需的部分。这将阻止不必要的临时对象。那看起来像
ByteArrayData.append(data.data() + n, data.size() - n);
您可以使用
QByteArray::mid
:
ByteArrayData = data.mid(n);
//...
ByteArrayData.append(data.mid(n));
在约阿希姆的回答中,在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);
谢谢,但是我得到了以下错误,错误:将'const QByteArray'作为'QByteArray&QByteArray::remove(int,int)'的'this'参数传递,丢弃限定符[-fppermissive]@beparas啊,是的,我错过了
const
。我会更新。谢谢,append()函数怎么样。@您的意思是要将数据中除前n个字节以外的所有字节都追加到ByteArrayData?my CopyData()函数调用三次,每次'data'有'n'个字节的修复头,您的解决方案适用于第1种情况:),但如何追加数据(删除头)在上述代码中的第2和第3种情况下。谢谢
// 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);