c++ 将QByteArray转换为uint8_t*(uint8_t数组)

vmdwslir  于 2023-02-06  发布在  其他
关注(0)|答案(2)|浏览(1377)

如何将来自QFile::readAll()QByteArray转换为uint8_t数组(uint8_t*)?
我尝试了static_cast<>(),但似乎对整个阵列都不起作用。
我对static_cast所做的事情的例子:

uint8_t* x = new uint8_t;
x[0] = static_cast<uint8_t>(testWav.readAll()[0]);
uint8_t* x = new uint8_t;
*x = static_cast<uint8_t>(*testWav.readAll());

等等都不起作用

f0brbegy

f0brbegy1#

我认为首先你需要知道指针不是数组,而且你不能把一个c-数组作为一个整体来赋值。
那么,如果您真的需要转换任何东西,那么您应该重新考虑。QByteArray通过它的data成员赠款您对底层数组的访问权限。(我发现QByteArray基于char而不是unsigned char有点不幸,因此您需要检查char是否有符号)。
最后,如果仍然需要,可以编写一个循环,将QByteArray中的元素复制到另一个数组中。

gcuhipw9

gcuhipw92#

这不是你想要的。

uint8_t* x = new uint8_t;
 x[0] = static_cast<uint8_t>(testWav.readAll()[0]);

这种方法只复制数组中的[0]元素,其余的分配内存保持未初始化状态
这根本行不通:

uint8_t* x = new uint8_t;
*x = static_cast<uint8_t>(*testWav.readAll());

QByteArray是一个类类型的动态容器,所以你不能用static_cast来访问数组中的数据,这是一个本质上不同的、不兼容的数据结构,而且你仍然只给第一个元素赋值:*xx[0]的等价物。
QByteArray具有方法QByteArray::data(),该方法返回指向char*的指针:https://doc.qt.io/qt-6/qbytearray.html#data
data()返回的指针不拥有类,而是指向类分配的内存,因此readAll()返回的QByteArray中包含的数据将在包含它的语句结束时停止存在,除非它被分配到更持久的存储:

QByteArray fileContent = file.readAll();
char *buffer = fileContent.data();

fileContent.size()的结果将给予缓冲区的实际大小。请注意,在某些情况下,使用QByteArray比使用原始指针更方便。只有在必须使用某些API获取原始指针或面临某些性能问题时,才需要转换。

相关问题