QT数据转换(数值、QString、QByteArray、结构体)

1. 基础类型互转

数值 ↔ QString

    //int → QString
    int intVal = 255;  
    QString strInt1 = QString::number(intVal); // 十进制:"255"  
    QString strInt2 = QString::number(intVal, 16); // 十六进制小写:"ff"  
    QString strInt3 = QString::number(intVal, 16).toUpper(); // 十六进制大写:"FF"  
    
    setNum()亦可,均可实现有无符号转QString
    //QString→ int
    QString qstr = "10086";
    int num = qstr.toInt(); // num=10086
    //QString→ uint

     转无符号类型使用toUInt();

bool ↔ QString

    // 1. bool → QString
    // 方法1
    bool flag = true;
    QString qstrBool = flag ? QString("true") : QString("false");
    // 方法2
    bool test = true;
    QString s = QString::number(test);
    // 方法3
    bool bInput = false;
    QString s = QVariant(bInput).toString();
    
    // 2. QString → bool
    QString s = "true";
    bool bInUse = QVariant(s).toBool();

QString 与 QByteArray 互转

QString 是 Unicode 文本容器(UTF-16),QByteArray 是原始字节容器(8 位),互转核心是编码映射,需显式指定编码避免乱码。

  • QString → QByteArray
    #include <QString>  
    #include <QByteArray> 
    #include <QTextCodec>  

    QString qstr = "QT字符串转字节数组:中文测试";  
    // 1. 转UTF-8编码(推荐:网络传输、跨平台文件)  
    QByteArray utf8Arr = qstr.toUtf8();  // 用途:QTcpSocket发送、QFile写入(UTF-8文件)  
    // 2. 转系统本地编码(如Windows GBK、Linux UTF-8,慎用跨平台)  
    QByteArray localArr = qstr.toLocal8Bit();  
    // 3. 转GBK编码(需显式指定编解码器,用于旧系统交互)  
    QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
    if (gbkCodec)
    {  
        QByteArray gbkArr = gbkCodec->fromUnicode(qstr); // GBK编码字节  
     }  
  • QByteArray → QString
    // 1. UTF-8字节 → QString(对应toUtf8())  
    QByteArray utf8Arr = "\xE4\xB8\xAD\xE6\x96\x87\xE6\xB5\x8B\xE8\xAF\x95"; // UTF-8编码的"中文测试"  
    QString qstr1 = QString::fromUtf8(utf8Arr); // 正确解析:"中文测试"  

    // 2. GBK字节 → QString(对应fromUnicode())  
    QByteArray gbkArr = "\xD6\xD0\xCE\xC4\xB2\xE2\xCA\xD4"; // GBK编码的"中文测试"  
    QTextCodec* gbkCodec = QTextCodec::codecForName("GBK");  
    if (gbkCodec) {  
        QString qstr2 = gbkCodec->toUnicode(gbkArr); // 正确解析:"中文测试"  
    }  

    // 3. 二进制字节 → 十六进制文本(用于日志/协议解析)  
    QByteArray binaryArr = QByteArray::fromRawData("\x01\x02\xFF\xFE", 4); // 二进制数据  
    QString hexStr = binaryArr.toHex().toUpper(); // 转十六进制文本:"0102FFFE"  

结构体与 QByteArray 互转

1、结构体转换QByteArray

    /**
     * @brief 结构体转QByteArray(通用函数)
     * @tparam T 结构体类型(必须是POD类型,不含指针)
     * @param structData 输入的结构体对象
     * @return 转换后的QByteArray
     */

    template <typename T>
    static QByteArray structToByteArray(const T& structData) {
        QByteArray byteArray;
        // 预留结构体大小的空间(字节数 = 结构体大小)
        byteArray.resize(sizeof(T));
        // 将结构体的内存数据拷贝到QByteArray
        std::memcpy(byteArray.data(), &structData, sizeof(T));
        return byteArray;
    }

2、QByteArray转换结构体

/**
     * @brief QByteArray转结构体(通用函数)
     * @tparam T 结构体类型(必须是POD类型,不含指针)
     * @param byteArray 输入的QByteArray
     * @param structData 输出的结构体对象(引用)
     * @return 转换是否成功(true:成功;false:字节数组大小不匹配)
     */

    template <typename T>
    static bool byteArrayToStruct(const QByteArray& byteArray, T& structData) {
        // 校验字节数组大小是否与结构体大小一致(避免内存越界)
        if (byteArray.size() != static_cast<int>(sizeof(T))) {
            qWarning() << "转换失败:字节数组大小(" << byteArray.size()
                       << ")与结构体大小(" << sizeof(T) << ")不匹配!";
            return false;
        }
        // 将字节数组的数据拷贝到结构体
        std::memcpy(&structData, byteArray.data(), sizeof(T));
        return true;
    }
posted @ 2025-11-15 22:32  农夫三拳001  阅读(356)  评论(0)    收藏  举报