内存中的二进制解析为小数

这两天这处理激光雷达的数据,中途遇到一个问题特别有意思,在这里记录一下,就是给你一片内存二进制数组如何把它以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;
}

自己理解吧,回去睡觉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值