当前位置: 首页 > news >正文

Qt:关于16进制数转化那些事

前言

由于当时做UDP通信的时候使用16进制数与QString的相互转换,但是当时我所要求的转换不仅仅是转化过去就行了,我还有字节数要求,就是这个16进制数占据多少位那么转化后的数据就该占据多大的空间。

正文

1 将 QString 转换为16进制字符串

1.1 当 QString中的内容不是数字时

对于这种你将QString转换成16进制字符串并没有办法节省空间。
要将 QString 转换为其对应的16进制表示,可以使用 QByteArraytoHex() 方法。首先,将 QString 转换为 QByteArray,然后调用 toHex() 方法获取16进制表示。

#include <QString>
#include <QByteArray>
#include <QDebug>int main() {QString originalString = "Hello, Qt!";// 将 QString 转换为 QByteArray(使用 UTF-8 编码)QByteArray byteArray = originalString.toUtf8();// 将 QByteArray 转换为16进制字符串QByteArray hexData = byteArray.toHex();// 将 QByteArray 转换为 QStringQString hexString = QString::fromUtf8(hexData);qDebug() << "原始字符串:" << originalString;qDebug() << "16进制字符串:" << hexString;return 0;
}

输出:

原始字符串: "Hello, Qt!"
16进制字符串: "48656c6c6f2c20517421"

1.2 当 QString中的内容是数字时

1.2.1当 QString中的内容是十进制数字时
#include <QString>
#include <QByteArray>
#include <QDebug>int main() {QString decimalString = "4953";bool ok;// 将 QString 转换为整数,占据四个字节,基数为16int number = decimalString.toInt(&ok);if (ok) {qDebug() << "10进制字符串" << decimalString << "转换为整数:" << number;} else {qDebug() << "转换失败";}// 初始化QByteArrayQByteArray bArray;bArray.resize(4);for (int i = 0; i < bArray.size(); i++) {bArray[i] = 0;}// 占据两个字节bArray[0] = number / 0x100;bArray[1] = number % 0x100;qDebug()<<"bArray: "<<bArray<<bArray.size();QByteArray bs = bArray.toHex();qDebug()<<"转化后的16进制数为:"<<bs<<bs.size();return 0;
}

这里可以节省一倍的空间,4953的字符串类型占据四个字节,转换成int类型占据四个字节,但是我巧妙将它放到QByteArray中就只用了两个字节。下面结果打印为4是因为我初始将bArray的大小初始化为4,但是我后面两个字节没有用。

运行结果

在这里插入图片描述

1.2.1当 QString中的内容是十六进制数字时
#include <QString>
#include <QByteArray>
#include <QDebug>int main() {QString hexString = "1A3F";bool ok;// 将 QString 转换为整数,占据四个字节,基数为16int number = hexString.toInt(&ok, 16);if (ok) {qDebug() << "16进制字符串" << hexString << "转换为整数:" << number;} else {qDebug() << "转换失败";}// 初始化QByteArrayQByteArray bArray;bArray.resize(4);for (int i = 0; i < bArray.size(); i++) {bArray[i] = 0;}// 占据两个字节bArray[0] = number / 0x100;bArray[1] = number % 0x100;qDebug()<<"bArray: "<<bArray<<bArray.size();return 0;
}

这里可以节省一倍的空间,1A3F的字符串类型占据四个字节,转换成int类型占据四个字节,但是我巧妙将它放到QByteArray中就只用了两个字节。

运行结果

在这里插入图片描述

1.2.2当 QString中的内容是有前缀的十六进制数字时

有时16进制字符串可能包含前缀,如 0x#,在进行转换时需要去除这些前缀。

1.2.2.1 处理带有 0x 前缀的16进制字符串
#include <QString>
#include <QDebug>
#include <QByteArray>
int main() {QString hexString = "0x1A3F";// 检查并移除前缀if (hexString.startsWith("0x") || hexString.startsWith("0X")) {hexString = hexString.mid(2);}bool ok = false;int number = hexString.toInt(&ok, 16);if (ok) {qDebug() << "16进制字符串(去除前缀)" << hexString << "转换为整数:" << number;} else {qDebug() << "转换失败";}// 初始化QByteArrayQByteArray bArray;bArray.resize(4);for (int i = 0; i < bArray.size(); i++) {bArray[i] = 0;}// 占据两个字节bArray[0] = number / 0x100;bArray[1] = number % 0x100;qDebug()<<"bArray: "<<bArray<<bArray.size();return 0;
}

其实处理步骤和没有前缀的差不多,就多了一个去除前缀的操作。

运行结果

在这里插入图片描述

1.2.2.2 处理带有 # 前缀的16进制颜色代码
#include <QString>
#include <QDebug>
#include <QByteArray>
int main() {QString colorCode = "#FF5733";// 移除 '#' 前缀if (colorCode.startsWith("#")) {colorCode = colorCode.mid(1);}bool ok = false;unsigned int colorValue = colorCode.toUInt(&ok, 16);if (ok) {qDebug() << "颜色代码" << colorCode << "转换为数值:" << colorValue;} else {qDebug() << "转换失败";}// 初始化QByteArrayQByteArray bArray;bArray.resize(4);for (int i = 0; i < bArray.size(); i++) {bArray[i] = 0;}// 占据三个字节bArray[0] = colorValue / 0x10000;bArray[1] = (colorValue % 0x10000) / 0x100;bArray[2] = colorValue % 0x100;qDebug()<<"bArray: "<<bArray<<bArray.size();QString str = bArray.toHex().toUpper();qDebug()<<"hex:"<<str;
}

其实处理步骤和没有前缀的差不多,就多了一个去除前缀的操作。

运行结果

在这里插入图片描述

2 将16进制字符串转换回 QString

2.1当转换后的QString字符串内容不是数字时

将16进制字符串转换回原始的 QString 需要进行逆向操作,即将16进制字符串转换为 QByteArray,然后再转换为 QString

#include <QString>
#include <QByteArray>
#include <QDebug>int main() {// 当16进制字符串内容不是数字时,就只能用字符串,或者QByteArray来表示了,这里使用字符串来表示QString hexString = "48656c6c6f2c20517421";// 将 QString 转换为 QByteArrayQByteArray hexData = hexString.toUtf8();// 将16进制字符串转换为 QByteArrayQByteArray byteArray = QByteArray::fromHex(hexData);// 将 QByteArray 转换为 QString(使用 UTF-8 编码)QString originalString = QString::fromUtf8(byteArray);qDebug() << "16进制字符串:" << hexString;qDebug() << "原始字符串:" << originalString;return 0;
}

输出:

16进制字符串: "48656c6c6f2c20517421"
原始字符串: "Hello, Qt!"
2.1当转换后的QString字符串内容是数字时
#include <QString>
#include <QByteArray>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int decimalData = 23;QString hex = QString::number(decimalData,16).toUpper();qDebug()<<"转换的16进制数为:"<<hex<<" 所占的大小为:"<<hex.size();
}
运行结果

在这里插入图片描述

小结

其实QStringQByteArray类型的数据很像,QByteArray一个数组空间就是一个字节,而QString中一个字符就是一个字节,但是QByteArray特殊在它能用来存储16进制数,1个字节是8bit,最大能存放一个FF,也就是说对于QByteArray一个字节能存放FF而对于QString来说需要两个字节,毕竟FF是两个字母嘛。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 软件测试面试八股文(含文档)
  • 算法练习题26——等差素数数列 (2017年蓝桥杯试题B)
  • 业务数据批量插入数据库实践
  • Java读取输入流(比如文件、网络资源等)并将数据输出到本地文件
  • Redis6.0.9配置redis集群
  • PL/SQL程序设计入门
  • 鸿蒙OS 线程间通信
  • 面经 | css
  • canvas练习画太阳花
  • 数据增强:提升机器学习模型性能的利器
  • 【Python百日进阶-Web开发-FastAPI】Day805 - FastAPI的请求体
  • Debian 12上安装google chrome
  • 2024年最新版Vue3学习笔记
  • 使用Renesas R7FA8D1BH (Cortex®-M85)实现多功能UI
  • Scrapy爬虫框架 Pipeline 数据传输管道
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • ComponentOne 2017 V2版本正式发布
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • hadoop集群管理系统搭建规划说明
  • jdbc就是这么简单
  • orm2 中文文档 3.1 模型属性
  • 诡异!React stopPropagation失灵
  • 检测对象或数组
  • 来,膜拜下android roadmap,强大的执行力
  • 两列自适应布局方案整理
  • 巧用 TypeScript (一)
  • 新手搭建网站的主要流程
  • 源码安装memcached和php memcache扩展
  • #C++ 智能指针 std::unique_ptr 、std::shared_ptr 和 std::weak_ptr
  • #Linux(Source Insight安装及工程建立)
  • #pragma pack(1)
  • #pragma预处理命令
  • (~_~)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)spring boot儿童教育管理系统 毕业设计 281442
  • (九)One-Wire总线-DS18B20
  • (四)事件系统
  • (一) 初入MySQL 【认识和部署】
  • (转)程序员疫苗:代码注入
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .Net MVC + EF搭建学生管理系统
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .netcore 获取appsettings
  • /bin/bash^M: bad interpreter: No such file or directory
  • @Pointcut 使用
  • [].slice.call()将类数组转化为真正的数组
  • [2016.7 day.5] T2
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [cb]UIGrid+UIStretch的自适应
  • [dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径