[static] QByteArray QByteArray::fromHex(const QByteArray &hexEncoded)
Returns a decoded copy of the hex encoded array hexEncoded. Input is not checked for validity; invalid characters in the input are skipped, enabling the decoding process to continue with subsequent characters.
For example:
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data(); // returns "Qt is great!"
See also toHex().
表示从十六进制数转成字符串。对其转换原理做简要说明。举例
QString hstring1("31323235");
QByteArray test1 = hstring1.toLocal8Bit();
QByteArray test2 = QByteArray::fromHex(test1);
变量test1用8个字符保存“31323235”,每个字符8位,两个字符16位。QByteArray::fromHex转换时,每16位作为转换单元。
转换步骤:
第一步,把“31323235”分成4组,“31”,“32”,“32”,“35”
第二步,以“31”为例,fromHex表示从16进制。所以把31当做16进制数,转成十进制数是3*16+1=49. 结合ASCII码对照表,十进制数49对应数字1,把数字1当做字符“1”。其他3组类似。
所以最终结果:
“31”->“1”
“32”->“2”
“32”->“2”
“35”->“5”
即变量test2的值是“1225”。
QByteArray QByteArray::toHex() const
Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and the letters a-f.
See also fromHex().
QByteArray QByteArray::toHex(char separator) const
This is an overloaded function.
Returns a hex encoded copy of the byte array. The hex encoding uses the numbers 0-9 and the letters a-f.
If separator is not ‘\0’, the separator character is inserted between the hex bytes.
Example:
QByteArray macAddress = QByteArray::fromHex("123456abcdef");
macAddress.toHex(':'); // returns "12:34:56:ab:cd:ef"
macAddress.toHex(0); // returns "123456abcdef"
This function was introduced in Qt 5.9.
See also fromHex().
有时候从网络获取到一串的mac地址却是没有使用":"或空格分隔开来,未免会让用户阅读困难起来。在Qt5.9及其以上版本QByteArray的toHex接口或许可以解决你的问题。
toHex接口
返回QByteArray类型的十六进制编码副本。该十六进制编码使用数字0-9和字母a-f。
如果分隔符不是’\0’或0,分隔符将插入十六进制字节之间。
注意:该函数是在Qt 5.9中引入。
QByteArray QByteArray::toHex(char separator) const
本文章主要总结QByteArray类的用法,主要是总结如何给QByteArray的对象赋值十六进制数和显示该十六进制数以及十六进制数在QByteArray中的存储形式,具体的实例如下所述:(字符表示的十六进制数:’\xFF’)
(Qt中QByteArray存储的十六进制数是0xff,实际是以ascll码存储的,存储形式为’\xff’,所以如果需要比较的话,需要用array.at(0) == '\xff’表示,而不是array.at(0) == 0xff)
(要知道QByteArray里面存储的是int整数,还是字符’f’,如果是int整数,则用int或者hex来判断;如果是字符’f’,则用字符’f’来判断:
比如QByteArray内容为:ff,即QByteArray[0]=f,QByteArray[1]=f,则QByteArray里面存储的是两个字符’f’,而不是整数255.
比如QByteArray内容为:ff,即QByteArray[0]=ff,则QByteArray里面存储的是一个整数255,而不是两个字符’ff’.)
上述结果表明,array数组的长度为1个字节,可以直接用十六进制数赋值给array数组的第0字节,即代码array[0] = 0xfE; 当赋值完十六进制数后,这个十六进制数就占用array数组的一个字节,查看该字节的内容时,可以用函数toHex()将这个十六进制数(占空间一个字节)显示出来。用qDebug类可以完成,即代码qDebug()< 参考链接: https://blog.csdn.net/naibozhuan3744/article/details/79094067 https://blog.csdn.net/jays_/article/details/83651453?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-4.no_search_link&spm=1001.2101.3001.4242.3 QByteArray在串口通讯中经常被使用,有一定必要较为全面详细的对QByteArray进行阐述。本文通过以下几个部分加以介绍 1 初始化 2 访问与赋值 访问QByteArray主要有4中方式,分别为[]、at()、data[]和constData[]。其中[]和data[]为可读可写,at()和constData[]仅为可读。如果仅是读,则通过at()和constData[]访问速度最快,因可避免复制处理。示例如下: 3 添加、删除、插入与替换操作 4 查找与比较 5 数据转换与处理 从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括: 1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等; 2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等; 3)转为整型、浮点型等数值类型; 4)大小写转换; 5)转为字符串类型; 5.1 Hex转换 把Hex编码转换为char存储到QByteArray: 5.2 数值转换与输出 尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下: 把单个字符转为2-36进制数据格式: 按照指定进制格式直接复制,其中n可以是各类常见数值类型: 把数值按指定格式和小数位转换输出,小数位四舍五入: 5.3 字符串数值转为各类数值 QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下: 5.4 大小写转换 QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换,示例如下: 5.5 与字符串互转 QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表,链接如下:ASCII可显示字符 QByteArray转为QString示例: QString转为QByteArray示例: https://blog.csdn.net/qq_34322603/article/details/106457231?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-8.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-8.no_search_link QString str1 = ui->textEdit->toPlainText(); 原文链接:https://blog.csdn.net/maowendi/article/details/52149272 See also fromHex(). toHex接口 示例
https://blog.csdn.net/u012911202/article/details/85263746串口通信之 QByteArray详解
QByteArray ba;
ba.resize(6);
ba[0] = 0x3c;
ba[1] = 0xb8;
ba[2] = 0x64;
ba[3] = 0x18;
ba[4] = 0xca;
ba.data()[5] = 0x31;
qDebug()<<"[]"<<ba[2]; //[] d
qDebug()<<"at()"<<ba.at(2); //at() d
qDebug()<<"data()"<<ba.data()[2]; //data() d
qDebug()<<"constData()"<<ba.constData()[2]; //constData() d
qDebug()<<"constData()"<<ba.constData()[5]; //constData() 1
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data(); // returns "Qt is great!" 把QByteArray转为Hex编码:QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2] = 0x32;
qDebug() << ba.toHex(); //return "303132"
int n = 63;
qDebug()<<QByteArray::number(n); // returns "63"
qDebug()<<QByteArray::number(n, 16); // returns "3f"
qDebug()<<QByteArray::number(n, 16).toUpper(); // returns "3F"
qDebug()<<QByteArray::number(n, 2); // returns "111111"
qDebug()<<QByteArray::number(n, 8); // returns "77"
QByteArray ba;
int n = 63;
ba.setNum(n); // ba == "63"
ba.setNum(n, 16); // ba == "3f"
QByteArray ba1 = QByteArray::number(12.3456, 'E', 3);
QByteArray ba2 = QByteArray::number(12.3456, 'f', 3);
qDebug()<<ba1; // returns "1.235E+01"
qDebug()<<ba2; // returns "12.346"
QByteArray strInt("1234");
bool ok0;
qDebug() << strInt.toInt(); // return 1234
qDebug() << strInt.toInt(&ok0,16); // return 4660, 默认把strInt作为16进制的1234,对应十六进制数值为4660
QByteArray string("1234.56");
bool ok1;
qDebug() << string.toInt(); // return 0, 小数均视为0
qDebug() << string.toInt(&ok1,16); // return 0, 小数均视为0
qDebug() << string.toFloat(); // return 1234.56
qDebug() << string.toDouble(); // return 1234.56
QByteArray str("FF");
bool ok2;
qDebug() << str.toInt(&ok2, 16); // return 255, ok2 == true
qDebug() << str.toInt(&ok2, 10); // return 0, ok == false, 转为十进制失败
QByteArray x("Qt by THE QT COMPANY");
QByteArray y = x.toLower();
// y == "qt by the qt company"
QByteArray z = x.toUpper();
// z == "QT BY THE QT COMPANY"
QByteArray ba("abc123");
QString str = ba; //方法一
qDebug()<<str ;
//输出:"abc123"
QByteArray ba("abc123");
QString str;
str = str.prepend(ba); //方法二
qDebug()<<str ;
//输出:"abc123"
QString str("abc123");
QByteArray ba = str.toLatin1(); //方法一
qDebug()<<ba;
QString str("abc123");
QByteArray ba = str.toUtf8(); //方法二
qDebug()<<ba;
QByteArray bytes;
bytes.resize(5);
bytes[0] = '1';
bytes[1] = '2';
bytes[2] = '3';
bytes[3] = '\0';
bytes[4] = 'a';
cout << bytes << endl;
串口通信中QByteArray的数据转换
实现十六进制接收文本和显示文本(可用于串口的十六进制)
1.QTextEdit接收文本
QByteArray str2 = QByteArray::fromHex (str1.toLatin1().data());//按十六进制编码接入文本void MainWindow::on_pBtnSendCmd_clicked()
{
QString str1 = ui->lineEdit_SendCmd->text();
QByteArray ba1 = QByteArray::fromHex(str1.toLatin1().data()); //按照十六进制编码接入文本
qDebug()<<ba1;
}
2.QTextEdit显示文本
QString strDis;
QString str3 = str2.toHex().data();//以十六进制显示
str3 = str3.toUpper ();//转换为大写
for(int i = 0;i<str3.length ();i+=2)//填加空格
{
QString st = str3.mid (i,2);
strDis += st;
strDis += " ";
}
ui->textEdit_2->append(strDis);
//注意收发两端文本要使用对应的编解码
const QByteArray recv_test = socket->readAll();
//qDebug()<<"recv msg:"<
函数:QByteArray QByteArray::toHex() const
返回QByteArray类型的十六进制编码副本。该十六进制编码使用数字0-9和字母a-f。
如果分隔符不是’\0’或0,分隔符将插入十六进制字节之间。
注意:该函数是在Qt 5.9中引入。QByteArray QByteArray::toHex(char separator) const
QByteArray byteArray = QByteArray::fromHex("1a2b3c4d5e6f");
byteArray.toHex(':'); // returns "1a:2b:3c:4d:5e:6f"
byteArray.toHex(0); // returns "1a2b3c4d5e6f"
byteArray.toHex('\0'); // returns "1a2b3c4d5e6f"