这两天这处理激光雷达的数据,中途遇到一个问题特别有意思,在这里记录一下,就是给你一片内存二进制数组如何把它以double形式去解读成小数。
前后处理了一下,感觉还是有点难度和意思的,如果大家还有新的思路可以留言在下面一起看看。
如:double在内存中占64位 8个字节,如内存中有这样一串二进制数 0x400774DF5E583356,如何解析恢复成小数2.932067.
在内存中整形的解读就是直接 系数*权值 累加就得到这个整数了,但是小数的保存形式不同。float是 1位符号位+8位阶码+23位尾长=32位,double是 1位符号位+11位阶码+52位尾长=64位。有人可能会想到把每一部分拼起来累加在一起,这种方式我感觉应该会麻烦,没有试,感兴趣可以试试也让我看看。
我想下面一点办法。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char str[15];
double num;
sprintf(str, "%e", 0x400774DF5E583356);
puts(str);
num=atof(str);
printf("%f\n",num);
return 0;
}
上面这种方法主要是将这片内存以“%e”以解读,并把结果保存在字符串str中。然后再将字符串转化为整数,这里可以先对字符串处理一下,以便输出更多的数。
sprintf和printf差不多,printf是输出到终端显示,sprintf是输出到前面的字符串中。如sprintf(str,“%s love %s”,“i”,“you”);则结果是str=“i love you”,怎么样是不是比strcat好用。但是这个处理还可以再简化,看看下面的,有没有喜出外望。
#include<stdio.h>
union number
{
double x;
unsigned char a[8];
};
int main()
{
union number w;
w.a[0]=0x56;
w.a[1]=0x33;
w.a[2]=0x58;
w.a[3]=0x5e;
w.a[4]=0xdf;
w.a[5]=0x74;
w.a[6]=0x07;
w.a[7]=0x40;
printf("%f",w.x);
return 0;
}
自己理解吧,回去睡觉