QByteArray to QString

本文介绍了一种将QByteArray转换为QString的方法,通过逐字节处理并考虑了字符编码问题,确保转换过程中不会出现乱码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QByteArray => QString

void BarEngine::ByteArrayToString(QByteArray &ba, QString &str)
{
    int i = 0;
    int nCount = ba.count();
    QByteArray bb;
    for(i=0; i < nCount; i++) {
        bb.append( ba.at(i) | 0x0000 );
    }

    str.clear();
    nCount = bb.count();
    for(i=0; i < nCount;) {
        if( bb.at(i) < 0x00a1 ) {
            str += QChar(bb.at(i)); i++; continue;
        } else {
            if( i+1 >= nCount ) {
                //最后一个字节没有配对儿的
                Q_ASSERT(1 == 2);
            } else {
                if( bb.at(i+1) > 0x00a0 ) {
                    str += QChar( ( bb.at(i) << 8 | bb.at(i+1) ) );
                    i = i+2;
                } else {
                    //缺少一个字节进行配对儿
                    Q_ASSERT( 1==2 );
                }
            }
        }
    }
}

转载于:https://www.cnblogs.com/zi-xing/p/8545471.html

在 Qt 中,`QByteArray` 和 `QString` 是两个非常常用的类,分别用于处理**二进制数据**和**文本数据(Unicode)**。理解它们之间的区别和使用场景非常重要。 --- ## 📌 一、QByteArray 简介 `QByteArray` 用于存储原始的二进制数据或 8 位字符(`char`),适合处理非文本数据,比如网络传输、文件读写、图像数据等。 ### 示例: ```cpp QByteArray data = "Hello Qt"; qDebug() << data; // 输出:"Hello Qt" ``` ### 特点: - 存储的是 `char` 类型数据(8 位)。 - 不进行编码转换。 - 适用于处理原始二进制数据(如 socket 数据、文件内容)。 - 可以用 `QByteArray::toHex()`、`QByteArray::fromBase64()` 等方法进行编码/解码。 --- ## 📌 二、QString 简介 `QString` 用于存储 Unicode 文本(16 位 `QChar`),是 Qt 中处理文本的标准方式,适合处理用户界面显示、文本处理、文件内容(文本)等。 ### 示例: ```cpp QString str = "你好,世界"; qDebug() << str; // 输出:"你好,世界" ``` ### 特点: - 存储的是 `QChar` 类型(16 位 Unicode)。 - 支持国际化、多语言。 - 可以与 `QByteArray` 相互转换,但需要指定编码(如 UTF-8、GBK)。 --- ## 🔄 三、QByteArrayQString 的相互转换 由于它们分别处理不同类型的字符串,转换时需要指定编码方式。 ### 1. QByteArrayQString ```cpp QByteArray ba = "你好 Qt"; QString str = QString::fromUtf8(ba); // 使用 UTF-8 解码 qDebug() << str; ``` > ⚠️ 如果 `QByteArray` 包含的不是 UTF-8 编码的文本,可能会出现乱码。 ### 2. QStringQByteArray ```cpp QString str = "Hello 世界"; QByteArray ba = str.toUtf8(); // 转为 UTF-8 编码的 QByteArray qDebug() << ba; ``` --- ## 🧪 四、实际使用场景对比 | 使用场景 | 推荐类型 | 说明 | |----------|-----------|------| | 网络通信 | `QByteArray` | 接收/发送原始二进制数据 | | 文件读写(二进制) | `QByteArray` | 如读取图片、音频等文件 | | 文件读写(文本) | `QString` | 使用 QTextStream 处理 | | 用户界面显示 | `QString` | 显示中文、支持国际化 | | JSON、XML 数据解析 | `QString` / `QByteArray` | 根据输入格式选择 | | 数据加密、压缩 | `QByteArray` | 操作二进制数据 | --- ## 🧪 五、示例代码:网络通信中使用 QByteArrayQString ```cpp QTcpSocket *socket = new QTcpSocket(this); connect(socket, &QTcpSocket::connected, [=]() { qDebug() << "Connected!"; QString msg = "Hello Server"; socket->write(msg.toUtf8()); // 发送 UTF-8 编码的 QByteArray }); connect(socket, &QTcpSocket::readyRead, [=]() { QByteArray reply = socket->readAll(); QString str = QString::fromUtf8(reply); qDebug() << "收到回复:" << str; }); ``` --- ## ✅ 六、总结对比表 | 特性 | QByteArray | QString | |------|------------|---------| | 存储类型 | `char`(8 位) | `QChar`(16 位 Unicode) | | 编码处理 | 不自动处理编码 | 自动处理 Unicode | | 使用场景 | 二进制数据、网络通信 | 文本处理、界面显示 | | 转换方式 | `fromUtf8()`, `toUtf8()` | `toUtf8()`, `toLocal8Bit()` | | 是否可读 | 二进制数据不可读 | 文本可读 | --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值