目录
- 1. 基础类型互转
- 数值 ↔ QString
- bool ↔ QString
- QString 与 QByteArray 互转
- 结构体与 QByteArray 互转
1. 基础类型互转
数值 ↔ QString
//int → QStringint 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→ intQString qstr = "10086";int num = qstr.toInt(); // num=10086//QString→ uint转无符号类型使用toUInt();
bool ↔ QString
// 1. bool → QString// 方法1bool flag = true;QString qstrBool = flag ? QString("true") : QString("false");// 方法2bool test = true;QString s = QString::number(test);// 方法3bool bInput = false;QString s = QVariant(bInput).toString();// 2. QString → boolQString 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));// 将结构体的内存数据拷贝到QByteArraystd::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;}