QByteArray data = reply->readAll(); strResult = QString::fromUtf8(data);报错/home/ccy/daimabeifen/vtmmonitor_rizhishangchuan/vtmmonitor/CDownload.cpp:210: error: passing 'const QString' as 'this' argument discards qualifiers [-fpermissive] strResult = QString::fromUtf8(data); ^
时间: 2024-02-14 17:17:41 浏览: 112
这个错误是因为你的`strResult`变量被声明为常量,所以不能在其上调用非常量成员函数。你可以将其声明为非常量来解决这个问题,或者使用`const_cast`来去除常量性。下面是两种解决方案的示例:
1. 将`strResult`声明为非常量:
```c++
QString strResult;
QByteArray data = reply->readAll();
strResult = QString::fromUtf8(data);
```
2. 使用`const_cast`去除常量性:
```c++
const QString strResult;
QByteArray data = reply->readAll();
QString& nonConstStrResult = const_cast<QString&>(strResult);
nonConstStrResult = QString::fromUtf8(data);
```
但是,第二种解决方案并不是推荐的做法,如果不是必须去除常量性,最好还是使用第一种方法。
相关问题
如何将QByteArray data = tmpSocket->readAll();读到的数据存到16进制数组?
当你从`tmpSocket`中读取数据到`QByteArray` `data`时,你可以通过迭代这个字节数组并将每个元素转换为16进制字符串,然后存储在一个数组中。以下是一个简单的步骤说明:
1. 创建一个新的`QVector<QString>`来存放16进制字符串,因为QByteArray可以很方便地转换成字符数组。
```cpp
QVector<QString> hexArray;
```
2. 遍历`QByteArray`,使用QString::number()函数将每个字节转换为16进制,并添加到hexArray中。假设字节是以little-endian格式存储的。
```cpp
for (int i = 0; i < data.size(); ++i) {
quint8 byte = data[i];
QString hex = QString::number(byte, 16, 16); // 第二个参数16表示16进制,第三个参数1表示小端对齐
hexArray.append(hex);
}
```
现在`hexArray`里就包含了所有原始数据的16进制形式。如果你需要的是实际的16进制数字数组,可以直接把它们连接起来作为一个字符串数组,或者转换成整数数组(如quint16_t*)。
如何将QByteArray data = tmpSocket->readAll();读到的数据存到16进制数组?需要的是实际的16进制数字数组
当你从`QByteArray` `data` 中读取数据并想将其转换为16进制表示的数组时,可以按以下步骤操作:
1. 首先,确保你有一个足够的大小的数组来存储16进制值。数据长度通常是原始字节数的一半,因为每个字节对应两个十六进制字符(0-F)。例如,如果原始字节数是`n`,你需要一个长度为`n / 2`的数组。
2. 创建一个新的`QStringList`,这是Qt中处理字符串的好选择,因为它可以直接转换为16进制。
```cpp
QStringList hexValues;
hexValues.reserve(data.size() / 2); // 确保有足够的空间
```
3. 使用循环遍历`data`,并将每个字节转换为其对应的16进制字符并添加到`hexValues`中:
```cpp
for (int i = 0; i < data.size(); ++i) {
quint8 byte = data[i];
QString hexByte = QByteArray::number(byte, 16).toUpper();
hexValues << hexByte;
}
```
4. 最后,你可以通过索引来获取16进制数组。由于`QStringList`实际上是`QVector<QString>`,所以你可以直接使用`begin()`和`end()`迭代器来访问它:
```cpp
quint16_t* hexArray = new quint16_t[hexValues.size()];
for (size_t i = 0; i < hexValues.size(); i += 2) {
quint16_t value = qint16(*hexValues[i].toLatin1()) << 4 | qint16(hexValues[i + 1].toLatin1());
hexArray[i / 2] = value;
}
```
这将把每对连续的十六进制字符组合成一个16位无符号整数,并存储到`hexArray`中。
阅读全文