项目场景
通过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;
}