QByteArray::fromHex转换原理

利用QByteArray分离十六进制数

[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在Qt5.9中的赋值和显示以及存储形式(toHex()函数)

本文章主要总结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()<<array.toHex(); 可以实现该功能。当然,赋值十六进制也可以用字符来表示’\x0fE’ == 0xfE ,即’\x0fE’跟0xfE是等效的。

参考链接:
https://blog.csdn.net/u012911202/article/details/85263746

https://blog.csdn.net/naibozhuan3744/article/details/79094067

串口通信之 QByteArray详解

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[]访问速度最快,因可避免复制处理。示例如下:

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

3 添加、删除、插入与替换操作

4 查找与比较

5 数据转换与处理

从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:

1)转为HEX,用于显示十六进制,这点在调试时特别有用,因为大多HEX码是没有字符显示的,如0x00、0x20等等;

2)转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;

3)转为整型、浮点型等数值类型;

4)大小写转换;

5)转为字符串类型;

5.1 Hex转换 把Hex编码转换为char存储到QByteArray:

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"

5.2 数值转换与输出 尽管QByteArray是一个集合,但也可以作为一个特殊形式的数值用,其灵活的转换格式,可大大方便各种格式数据转换与显示的需求。如显示二进制和十六进制、显示科学计数和指定小数位的数值。示例如下:

把单个字符转为2-36进制数据格式:

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"  

按照指定进制格式直接复制,其中n可以是各类常见数值类型:

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"

5.3 字符串数值转为各类数值

QByteArray若为数值,可通过to**方法转为各种类型数据,示例如下:

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, 转为十进制失败

5.4 大小写转换 QByteArray若为带大小写的字符串,可通过toUpper()和toLower()方法实现大小写转换,示例如下:

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"

5.5 与字符串互转 QByteArray与QString互转极为简单,二者从本质上类似,都是连续存储,区别是前者可以存无法显示的字符,后者只存可显示的字符。如QByteArray可以存0x00-0x19,而QString则存储如0x30等可显示字符(0x20-0x7E)。可显示字符可参见ASCII表,链接如下:ASCII可显示字符

QByteArray转为QString示例:

QByteArray ba("abc123");
QString str = ba;    //方法一
qDebug()<<str ;
//输出:"abc123"    
QByteArray ba("abc123");
QString str;
str = str.prepend(ba);    //方法二
qDebug()<<str ;
//输出:"abc123"   

QString转为QByteArray示例:

QString str("abc123");
QByteArray ba = str.toLatin1();    //方法一
qDebug()<<ba;
QString str("abc123");
QByteArray ba = str.toUtf8();   //方法二
qDebug()<<ba;
  1. QByteArray类同样不以’\0’为结尾:如
QByteArray bytes;  
bytes.resize(5);  
bytes[0] = '1';  
bytes[1] = '2';  
bytes[2] = '3';  
bytes[3] = '\0';  
bytes[4] = 'a';  
 
cout << bytes << endl; 

串口通信中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

实现十六进制接收文本和显示文本(可用于串口的十六进制)

1.QTextEdit接收文本

QString str1 = ui->textEdit->toPlainText();
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:"<<recv_test;
            QString ret;
            for (int i=0; i<recv_test.count(); ++i) {
                ret.append(tr("%1 ").arg((quint8)recv_test.at(i),2,16,QLatin1Char('0')).toUpper());
            }
            ui->textEdit_message->append(ret);

原文链接:https://blog.csdn.net/maowendi/article/details/52149272

函数:QByteArray QByteArray::toHex() const

See also fromHex().

toHex接口
返回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"

  • 7
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值