QByteArray data; data.append(char("hall")); 为什么我用data.size()输出data的字节数,得到的是1,而不是4
时间: 2024-09-30 19:01:52 浏览: 32
在C++中,QByteArray是一个用于存储二进制数据的容器,它实际上是基于quint8类型的数组。当你使用`char("hall")`将字符串"hall"传递给append函数时,Qt库会将其视为一个单字符序列,因为"C"字符串实际上是在内存中按照ASCII编码存储的,每个字符占用1个字节。
"hall"这个字符串在ASCII编码下分别是'h'(0x68)、'a'(0x61)、'l'(0x6c)和'l'(0x6c),所以四个字符合并在一起占用的就是4个字节。然而,由于你直接用了一个字符操作符(char()),这使得`char("hall")`返回的是第一个字符'h',因此`data.size()`输出的是1,表示只添加了1个字节。
如果你想存储整个字符串"hall",你需要这样做:
```cpp
QByteArray data;
data.append('h');
data.append('a');
data.append('l');
data.append('l');
```
这样`data.size()`才会输出4,因为你已经明确地将每个字符逐个添加到了QByteArray中。
相关问题
QByteArray result;result.append((uint8_t)value);用C语言写
在C语言中,如果你想要实现类似的功能,即向QByteArray(Qt库中的字节数组)追加单个无符号字符(uint8_t类型的值),你可以使用标准库函数`qUnalignedAppend`。然而,由于C语言中没有直接对应的QByteArray,你会需要自己管理内存。以下是相应的代码:
```c
#include <stdint.h>
#include <stdlib.h>
// 如果你的QByteArray对应是char* 或者 uint8_t*
typedef uint8_t QByte;
QByte* result;
size_t size = 0;
// 初始化结果字节数组
if (result == NULL) {
result = (QByte*)malloc(sizeof(QByte));
if (result == NULL) {
// 处理内存分配失败的情况
printf("Memory allocation failed.\n");
return;
}
}
// 追加无符号字符
result[size++] = (QByte)value;
// 如果你想添加多个字符,每次循环将value替换为下一个字符
// while (/*条件*/) {
// result[size++] = value;
//}
// 确保处理完所有数据后释放内存
if (result != NULL && size > 0) {
free(result);
}
```
在这个示例中,你需要确保`value`是一个有效的无符号整数,并且在完成后记得释放内存。
优化代码 qint64 time_period = QDateTime::currentDateTime().toMSecsSinceEpoch(); //原始数据+8字节时间存储 QByteArray savedata; savedata.append((const char*)&time_period,8); savedata.append((const char*)frame.data(),len); if(filename_raw != ""){ filename_raw = filename_raw.replace("./data/","./data/unframe/"); SaveAsBytes(filename_raw,(const char*)savedata.data(),savedata.size()); }
可以考虑使用流式操作来优化代码,避免频繁的内存分配和拷贝。具体的实现方法如下:
```c++
qint64 time_period = QDateTime::currentDateTime().toMSecsSinceEpoch();
QByteArray savedata;
QDataStream stream(&savedata, QIODevice::WriteOnly);
stream << time_period << QByteArray((const char*)frame.data(), len);
if (!filename_raw.isEmpty()) {
QString filename = filename_raw;
filename.replace("./data/", "./data/unframe/");
QFile file(filename);
if (file.open(QIODevice::WriteOnly)) {
file.write(savedata);
file.close();
}
}
```
使用流式操作可以将数据直接写入到目标 `QByteArray` 中,避免了多次的内存分配和拷贝。同时,使用 `QFile` 来保存数据也可以避免在内存中保存大量的数据。
阅读全文