QbyteArray数据复制

6
我有两个 QByteArrays,sData 和 dData。
我想要从 dData 的位置 x 处拷贝 n 个字节,即 &dData[x],到 sData 的位置 y 处,即 &sData[y]。
在 C 中,可以通过 memcpy(&dData[x], &sData[y], n); 进行数组拷贝。
在 Qt 中,可以通过调用 sData.replace(y, n, dData.mid(x, n)); 来完成这一操作。

这不是一个答案,而是一个重要的考虑因素:请记住 QByteArray 的原始数据功能允许您将 QByteArray 对象用作 C 数组的前端。它 不会复制 任何来自所述原始数据的内容,并且您不能将此类 QByteArray 对象传递到存在原始数据的范围之外。 - d.Candela
3个回答

6
Qt文档中,您可以使用replace函数:-
QByteArray & QByteArray::replace(int pos, int len, const QByteArray & after)

从索引位置pos开始,用后面的字节数组替换长度为len的字节,并返回对此字节数组的引用。因此,使用重载方法:
QByteArray & QByteArray::replace(int pos, int len, const char * after);

sData = sData.replace(y, nBytes, dData.constData()+x);

我需要在替换之前预留内存吗? - S.M.Mousavi

6
除了给出的答案,你还可以使用memcpyQByteArray::data()成员函数来获取指向内部数组的指针。当然,此时您需要确保目标数组的大小足够大,以容纳从源数组复制的所有数据。
memcpy(dest.data() + y, src.constData() + x, n)

如果有memcpy的C++替代方案,我们应该使用类似setRawData或replace的替代方案。 - jaques-sam

-1
如果您想从索引零复制数据,可以使用以下函数:
sData.setRawData(dData, n);

5
FYI:此答案误导人,因为数据并没有被复制。Qt 的 setRawData() 文档中指出:“这些字节不会被复制。QByteArray 将包含数据指针。只要存在任何未被修改的 QByteArray 副本,调用者保证数据不会被删除或修改。” - K9spud

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接