Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 从QByteArray中删除第一个字节_Qt_Qbytearray - Fatal编程技术网

Qt 从QByteArray中删除第一个字节

Qt 从QByteArray中删除第一个字节,qt,qbytearray,Qt,Qbytearray,我想写一个函数,其中QByteArray是该函数的输入。 我想从接收数据中删除一些头并将其存储到全局QByteArray中 void abc::CopyData(const QByteArray &data) { switch(RequestPacketCount) { case REQUEST_FIRST_PACKET: { ByteArrayData = data; } b

我想写一个函数,其中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'中


提前谢谢

您似乎只需要复制原始数组并使用

由于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);