QByteArray在串口通讯中经常被使用,通信处理过程中,经常会涉及到数据格式的转换,有一定必要较为全面详细的对QByteArray数据转换与处理部分进行阐述。本文通过以下几个部分加以介绍:
主要内容
1、字符串发送与十六进制发送的区别
在使用串口发送数据时可以选择字符串发送或者十六进制发送,通常情况下我们习惯选用字符串发送数据。关于两者的区别,需要从计算机存储数据的格式说起。
在计算机中,数据是以二进制的形式存储的,例如十进制 1(10)在计算机中用 0000 0001(2)来表示。在使用字符串方式发送数据的时候,串口软件首先将待数据转换为对应的ASCII码,然后再将这些ASCII码按照二进制的方式一位一位的发送出去;而使用十六进制方式发送数据的时候,串口直接将数据以二进制的方式一位一位的发送出去。
例如我们在串口软件发送框输入 “FF012345”,分别以字符串和十六进制两种方式发送:
1.1字符串发送
串口以字符串发送数据,首先将字符串转化为ASCII码对应的二进制,格式如下
0100 0110 | 0100 0110 | 0011 0000 | 0011 0001 | 0011 0010 | 0011 0011 | 0011 0100 | 0011 0101 |
---|---|---|---|---|---|---|---|
F | F | 0 | 1 | 2 | 3 | 4 | 5 |
串口发送了8个字节,若在接收端选择字符串接收,则会接收到FF0123456这个字符串;若在接收端选择十六进制接收,则会接收到:
0100 0110 | 0100 0110 | 0011 0000 | 0011 0001 | 0011 0010 | 0011 0011 | 0011 0100 | 0011 0101 这一串数字
1.2十六进发送
串口以十六进制发送数据,首先将发送框中数据转化为如下格式:
1111 1111 | 0000 0001 | 0010 0011 | 0100 0101 |
---|---|---|---|
0xFF | 0x01 | 0x23 | 0x45 |
串口发送了4个字节,若在接收端选择十六进制接收,则会在接收框显示FF 01 23 45;若在接收端选择字符串接收,则会接收到乱码
仔细对照接收结果就很容易明白字符串发送和十六进制发送的区别了。
2、QByteArray数据转换与处理
从串口读取到的QByteArray数据,一般需要进行提取和解析,此时就需要QByteArray转换为各类型数据。常用转换包括:
1、字符与十六进制转换,例如串口接收到的数据,用字符方式表达,或者将字符串对应的十六进制数据流转化为字符串;
2、转为不同进制数值并显示,如二进制、八进制、十进制和十六进制等;
3、转为整型、浮点型等数值类型;
4、大小写转换;
5、转为字符串类型;
2.1 十六进制-字符
把Hex编码的数据流转换为char存储到QByteArray:
QByteArray text = QByteArray::fromHex("517420697320677265617421");
text.data(); // "Qt is great!"
把QByteArray数据转换为字符串:
QByteArray ba;
ba.resize(3);
ba[0] = 0x30;
ba[1] = 0x31;
ba[2]