首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从QByteArray中删除前几个字节

从QByteArray中删除前几个字节
EN

Stack Overflow用户
提问于 2014-03-19 13:21:38
回答 3查看 16.2K关注 0票数 10

我想编写一个将QByteArray输入到函数中的函数。我想从接收数据中删除一些头文件,并将其存储到全局QByteArray中。

代码语言:javascript
运行
复制
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’中

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-03-19 13:29:06

您似乎想要的是简单地复制原始数组并使用remove

代码语言:javascript
运行
复制
ByteArrayData = data;
ByteArrayData.remove(0, n);            // Removes first n bytes of ByteArrayData,
                                       // leaving data unchanged

由于QByteArray是隐式共享的,因此副本的构建需要固定的时间,而修改(删除)将在需要时创建实际的副本。

为了高效地追加,你可以使用data来获取字节数组,然后append你想要的部分。这将防止不必要的临时对象。它看起来像这样;

代码语言:javascript
运行
复制
ByteArrayData.append(data.data() + n, data.size() - n);
票数 7
EN

Stack Overflow用户

发布于 2014-03-19 15:06:33

您可以使用QByteArray::mid

代码语言:javascript
运行
复制
ByteArrayData = data.mid(n);
//...
ByteArrayData.append(data.mid(n));
票数 2
EN

Stack Overflow用户

发布于 2014-03-19 23:29:09

除了约阿希姆的回答,在C++中,一些实现细节泄漏到接口中是相当不幸的,但出于性能原因,仍然倾向于让编译器通过将参数作为值传递来进行复制。所以,套用一下,最好的解决方案是:

代码语言:javascript
运行
复制
void abc::CopyData(QByteArray data)
{
  ...
  data.remove(0, n);
  ...
  ByteArrayData.append(data);
}

你肯定不想让这样的参数通过值传递的唯一地方是信号声明-信号永远不会修改它们的数据。不过,插槽这样做是可以的:

代码语言:javascript
运行
复制
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连接方式,连接到任何一个插槽都使用相同的代码。因此,您不必担心由于泄露的实现细节而导致的此类接口更改。

代码语言:javascript
运行
复制
// 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22496928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档