QByteArray,char转float的方法以及计算机大小端判断

文章讨论了在UDP通信中,由于未考虑主机的字节序(小端或大端),导致从大端模式接收的小端格式float数据转换错误。解决方案是通过检测主机大小端并据此调整数据复制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目场景

通过udp收到一组数据,数据由32字节构成,每四个字节为一个float,总共8个float,发送来的数据为小端模式的数据。
小端:高字节在后,低字节在前。
大端:高字节在前,低字节在后。


问题描述

没有考虑本机大小端问题,导致memcpy函数转换过来的float数据一直不对。


原因分析:

本机是小端机器,使用memcpy时默认按照小端格式进行转换,如果是大端格式传过来的数据,在进行转换时则需要先将转换数据reverse,然后再进行数据转换。如果本机和需要转换数据的模式都是一样的,则不需要reverse,直接使用memcpy转换即可。


解决方案:

先判断计算机大小端,然后再进行数据类型进行转换(本机已经知道是小端,和数据给过来的模式一样,同为小端,直接使用memcpy即可)

QByteArray datagram1;
datagram1.resize(32);
datagram.resize(udpSocket_data_recv->pendingDatagramSize()); // 接收数据报,将其存放到datagram中         
udpSocket_data_recv->readDatagram(datagram.data(), datagram.size());
if(datagram.size() == 32)
{
	float acc[8];
	memcpy(acc, datagram.mid(0, 32), 32);
}

大小端判断方法:

#include<stdio.h>
int main()
{
    int val=0x11223344;
    char *p=(char *)&val;
    if(*p==0x44)//若低地址为低位0x44,则为小端模式,因为先存低位
        printf("Little Endian\n");
    if(*p==0x11)//若低地址为高位0x11,则为大端模式
        printf("Big Endian\n");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Acnidouwo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值