qt数据处理

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);//数组形式

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大桶矿泉水

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值