QByteArray的转换一般在串口通信中常用,将int、float、double转换为4个字节的数组(如255 -> [0,0,0,255],本文章一律用10进制表示),或将4个字节的数组转换为int、float、double(如[0,0,0,255] -> 255)。在QT界面中的使用流程,笔者总结为以下思路:
从上位机发送一帧指令到串口(封包、根据具体协议组装指令)
1.先将QString转int、float、double
2.再将int、float、double转QByteArray(例如参数qba)
3.最后将qba放到一帧数据中的数据位(需区分数据大小端,也就是[0,0,0,255] 和[255,0,0,0] )
从下位机接收一帧指令(解包、根据具体协议解析指令)
通常是将数据位的4个字节的数组逆向转换成对应的int、float、double数据。
一、 int与QByteArray
1.int转QByteArray(4字节)
1 // int转QByteArray
2 int in = 255;
3 QByteArray qba_i;
4
5 // 转
6 int li = sizeof(in);
7 qba_i.resize(li);
8 memcpy(qba_i.data(), &in, li);
9
10 // 将QByteArray转换成vector(vector存放类型需用uint8_t来接存放QByteArray中的元素)
11 std::vector<uint8_t> vecf(qba_f.begin(), qba_f.begin() + 4);
12 qInfo()<<veci<<endl;
2.QByteArray转int
1 // array使用上面的转换后的 qba_i 即可
2 int num_int;
3 memcpy(&num_int, array.data(), sizeof(num_int));
4 cout<<num_int;
5
6 // 等价于
7 // memcpy(&num_int, array, sizeof(num_int));
二、float与QByteArray(4字节,符合IEE754转16进制标准)
1.float转QByteArray
1 // float转QByteArray
2 float fn = 10000.0;
3 QByteArray qba_f;
4
5 int lf = sizeof(qba_f);
6 qba_f.resize(lf);
7 memcpy(qba_f.data(), &fn, lf);
8
9 // 将QByteArray转换成vector(vector存放类型需用uint8_t来接存放QByteArray中的元素)
10 std::vector<uint8_t> vecf(qba_f.begin(), qba_f.begin() + 4);
11 qInfo()<<vecf<<endl;
2.QByteArray转float
1 // array使用上面的转换后的 qba_f 即可
2 float num_float;
3 memcpy(&num_float, array.data(), sizeof(num_float));
4 cout<<num_float;
5
6 // 等价于
7 // memcpy(&num_float, qba_f, sizeof(num_float));
三、vector与QByteArray
1.QByteArray转vector
1 // 将QByteArray转换成vector(vector存放类型需用uint8_t来接存放QByteArray中的元素)
2 std::vector<uint8_t> vecf(qba_f.begin(), qba_f.begin() + 4);
2.vector转QByteArray
直接将vector遍历元素,append()到QByteArray中即可。
后续有其他更优的方法再更新~