2014-03-19 37 views
2

我想寫一個函數,其中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'no。從'數據'開始的字節並將剩餘數據存儲到'ByteArrayData'

在此先感謝。

回答

2

你似乎想要的僅僅是複製原始數組並使用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); 
+0

謝謝,但我得到了下面的錯誤,錯誤 :過客 '常量的QByteArray' 爲 '本' 的說法 '的QByteArray&的QByteArray ::刪除(INT,INT)' 丟棄預選賽[-fpermissive] – beparas

+0

@beparas啊,是的,我錯過了'const'。我會更新。 –

+0

謝謝,append()函數呢。 – beparas

1

您可以使用QByteArray::mid

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

添加到勒夫的回答,在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);