加入收藏 在线留言 联系我们
关注微信
手机扫一扫 立刻联系商家
全国服务热线15915421161

SIEMENS江苏省南通市 西门子代理商——西门子华东一级总代理

更新时间
2024-11-16 07:00:00
价格
请来电询价
西门子总代理
PLC
西门子一级代
驱动
西门子代理商
伺服电机
联系电话
15903418770
联系手机
15915421161
联系人
张经理
立即询价

详细介绍

实际的编程应用中,特别是数据传输通信等场合,需要传输float等类型的数据,而常用的数据传输形式一般为hex格式字符串格式,通常我们会选用hex格式,更接近计算机的2进制,而这种传输方式就需要将float转换为hex格式了。

在计算机中,float占用4个字节,因此可以考虑将float拆分为4个hex格式的16进制数,完成数据传输后,接收方再将4个hex重组为float即可还原出原来的数据,这有点像数据的编码和解码的意味。

分步测试

float型的2进制形式

float的计算机中占用4个字节,具体是如何在计算机中存储的可以参考上一篇笔记:C语言打印数据的二进制格式-原理解析与编程实现,上次的int数据打印2进制的函数这里也可以用来测试,只需将参数类型改成float:




















  • void printf_bin(float num)//注意这次这里的参数类型改成了float{    int i, j, k;    unsigned char *p = (unsigned char*)&num + 3;
       for (i = 0; i < 4; i++) //处理4个字节(32位){        j = *(p - i); //取每个字节的首地址        for (int k = 7; k >= 0; k--) //处理每个字节的8个位        {            if (j & (1 << k))                printf("1");            else                printf("0");        }        printf(" ");}    printf("\r\n");}

    现在来测试一个float数据的2进制形式:
















  • float a = 3.887;//使用上次自己写的printf_bin函数打印一下float a的2进制形式printf("查看一下float型a=%f的2进制形式:\r\n", a);printf_bin(a);
    //使用unsigned char来验证float的每一个字节unsigned char *p1 = (unsigned char*)&a;  //获取a的首地址unsigned char *p2 = (unsigned char*)&a + 1;//获取a的首地址的后一个字节地址unsigned char *p3 = (unsigned char*)&a + 2;//获取a的首地址的后两个字节地址unsigned char *p4 = (unsigned char*)&a + 3;//获取a的首地址的后三个字节地址printf("\r\n查看a的每个字节的地址(16进制)与内容(10进制(+16进制)):\r\n");printf("[a] p1:%x, %d(%x)\r\n", p1, *p1, *p1);//打印p1的地址与存储的字节内容printf("[a] p2:%x, %d(%x)\r\n", p2, *p2, *p2);//打印p2的地址与存储的字节内容printf("[a] p3:%x, %d(%x)\r\n", p3, *p3, *p3);//打印p3的地址与存储的字节内容printf("[a] p4:%x, %d(%x)\r\n", p4, *p4, *p4);//打印p4的地址与存储的字节内容

    输出:

    查看一下float型a=3.887000的2进制形式:
    01000000 01111000 11000100 10011100
       
    查看a的每个字节的地址(16进制)与内容(10进制(+16进制)):
    [a] p1:5b5bf554, 156(9c)
    [a] p2:5b5bf555, 196(c4)
    [a] p3:5b5bf556, 120(78)
    [a] p4:5b5bf557, 64(40)

    这个输出结果实际上我们也无法直接看出拆分的到底对不对,上次测试int是对的,理论上也适用于float,因为2者都是4字节储存。

    我们可以先继续拆分测试,Zui后重组看看是否可以还原数据。


    相关产品

    联系方式

    • 电  话:15903418770
    • 联系人:张经理
    • 手  机:15915421161
    • 微  信:15915421161