1.十六进制字符串转数组
方式一:慢
方法:
QByteArray dataTemp="5aa51000150608112430ff15070912253153544f50";
QByteArray sd;bool ok;
for(int i=0;i<21;i++)sd[i]=dataTemp.mid(i*2,2).toInt(&ok,16);
结果:
sd[0]=0x5a;
....
sd[20]=0x50;
方式二:快
QByteArray Dataall="5aa51000150608112430ff15070912253153544f50";
QByteArray aaa;
aaa=QByteArray::fromHex(Dataall);//将一个个字符转成两个字符为一个数的16进制表示
aaa[0]=0x5a;
...
aaa[20]=0x50;
2.数组转十六进制字符串
QByteArray类型转换
QByteArray sd;
sd[0]=0xaa;
sd[1]=0x0b;
sd.toHex();//aa0b
char、int类型强制转换保留指定长度十六进制字符串
QString().sprintf("%02X",send[a]).right(2)//其中2可变为需求长度数值
3.数组转十进制字符串(保留固定长度)
//sd[0~5]=150608112430
startDataeTim.append(QString("%1").arg(sd[i],2,10,QChar('0')));//2是保留2位长度,10是10进制
//210608173648
4.测试二维QVector
//测试二维QVector
// QVector< QVector< QString > > mmmax;
// QVector< QVector< QString > > mmmin;
// QStringList aaa;
// aaa<<"111"<<"222"<<"333";
// QStringList bbb;
// bbb<<"-111"<<"-222"<<"-333";
// QStringList ccc;
// ccc<<"444"<<"555"<<"666";
// QStringList ddd;
// ddd<<"-444"<<"-555"<<"-666";
//mmmax.resize(2);
//mmmin.resize(2);
// for(int i=0;i<aaa.size();i++)
// mmmax[0].append(aaa.at(i));
// for(int i=0;i<bbb.size();i++)
// mmmin[0].append(bbb.at(i));
// for(int i=0;i<ccc.size();i++)
// mmmax[1].append(ccc.at(i));
// for(int i=0;i<ddd.size();i++)
// mmmin[1].append(ddd.at(i));
// qDebug()<<mmmax.size();
// qDebug()<<mmmax.at(0).size();
// qDebug()<<mmmax;
// qDebug()<<mmmin;
5.以二进制流数据存储TCP客户端接收数据,或UDP接收数据,或socket CAN总线数据,详细见demo
6.UDP通信传输结构体
定义结构体如下,要有对其
#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐
typedef struct
{
quint32 m_Head=0x5AA5;//帧头
char dp_zy_alldata[78*2]={0};//数据
quint32 m_End=0x53544F50;//帧尾
}Collectionbox;
#pragma pack(pop)//恢复对齐状态
赋值结构体内数据,之后发送
Collectionbox JKGLdata;
xxx
udpSocket8->writeDatagram((char*)&JKGLdata,sizeof(JKGLdata),QHostAddress(IPaddress), 6820);//IPaddress是指发送数据的目的地址
接收如下,在绑定的接收数据槽函数中使用如下命令接收(定义相同的结构体)
Collectionbox JKGLdata1;
udpSocket8->readDatagram((char*)&JKGLdata1,sizeof(JKGLdata1));//接收的数据存储结构体中
7.double、float转QBytearray
double aaa=1.2345678;
QByteArray array;
array.resize(8);
memcpy(array.data(), &aaa, 8);
qDebug()<<array.toHex();
float将8改成4,类型改为float即可。
8.QBytearray转double、float
QByteArray array=QByteArray::fromHex("cac0f33f");
float bbb;
memcpy(&bbb, array.data(),4);
qDebug()<<QString::number(bbb,'f',70);
double将4改成8,类型改为double即可。
9.十六进制字符串转整数
单字节和双字节字符串长度为2和4,转换方法如下:如0xaa,0xabcd
valueMIC=(uint8_t)turndata.mid(70*2,2).toInt(&ok,16);//信号原始数值
valueMIC=(uint16_t)turndata.mid(70*2,4).toInt(&ok,16);//信号原始数值
4字节和8字节字符串长度为8和16,转换方法如下:如0x1234aabb,0xaabbccdd11223344
uint32_t timeunix=(uint32_t)turndata.mid(72*2,8).toLongLong(&ok,16);//信号原始数值
uint32_t timeunix=(uint64_t)turndata.mid(72*2,16).toLongLong(&ok,16);//信号原始数值
10.正数转换负数
比如int类型传输,在计算数据时需要区分正负数,传输的时候为0-255或0-65535
1字节负数计算
if(ADC_buf1[2*i]>127)ADC_buf1[2*i]-=256;
2字节负数计算
if(ADC_buf1[2*i]>32767)ADC_buf1[2*i]-=65536;
以此类推
11.QBytearray转QString 和 QString转QBytearray
QBytearray→QString
QByteArray sd;
for(int i=0;i<1000;i++){//将数组转换为QByteArray数组格式
sd[i]=temp[i];
}
QString str=sd.toHex();//将QByteArray转换为字符串格式,十六进制字符串
QString →QBytearray(字符串和数组形式)
QString ss1;
QByteArray qwe=ss1.toLatin1();//字符串形式
QByteArray ba=QByteArray::fromHex(qwe);//数组形式