鱼C论坛

 找回密码
 立即注册
查看: 1830|回复: 6

[已解决]如何进行进制转化输出?

[复制链接]
发表于 2020-9-28 21:20:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、定义一个浮点型变量a=11.1234 作为发送端,它向接收端发送的是16进制代码 72 F9 31 41
2、在接收端编写程序
int temp;
int count = start + 0;
temp =(unsigned char)buf[count + 3] << 24 | (unsigned char)buf[count + 2] << 16 | (unsigned char)buf[count + 1] << 8 | (unsigned char)buf[count + 0] << 0;
a = (float)&temp;
把发送端与接收端通信连接后,接收端会输出a=11.1234
/***************************************************/
但是如果发送端发送一个双精度浮点型变量b=11.123456789作为发送端,它向接收端发送的是16进制代码C7 72 6E BA 35 3F 26 40
在接收端编写程序
int temp;
int count = start + 0;
temp =(unsigned char)buf[count + 3] << 24 | (unsigned char)buf[count + 2] << 16 | (unsigned char)buf[count + 1] << 8 | (unsigned char)buf[count + 0] << 0;
b = (double)&temp;
把发送端与接收端通信连接后,接收端会输出b=-9.25596e+061并没有输出想要的值
/**********************************************************/
/**********************************************************/
float四个字节 double八个字节
把接收端的代码修改成
temp =(unsigned char)buf[count + 7] << 56 | (unsigned char)buf[count + 6] << 48 |
                (unsigned char)buf[count + 5] << 40 | (unsigned char)buf[count + 4] << 32 |
                (unsigned char)buf[count + 3] << 24 | (unsigned char)buf[count + 2] << 16 |
                (unsigned char)buf[count + 1] << 8 | (unsigned char)buf[count + 0] << 0;
还是不对
如何修改接收端的解码程序,可以输出一个双精度浮点数?
希望大佬们可以帮助,交流一下,关于我这个内容在网上找了好久也没有找到,修改的内容应该是temp的解码程序,希望大佬们能帮忙指点一下!!
最佳答案
2020-9-29 09:49:05
123lll 发表于 2020-9-29 09:16
temp =(unsigned char)buf[count + 7]

你的temp是个什么类型?不会是int吧?int只有4字节,怎么存放八字节内容?buf是什么?char数组?char只有8位,怎么左移这么多位?昨天没有仔细看你的这些变量的类型。。。。
还是直接用联合体吧、直接看我写的那个例程,把多余的内容删掉就可以了

我帮你删除了一下,你可以根据自己需求,再改改
  1. #include <stdio.h>
  2. union Data{
  3.     float a;
  4.     char c[4];
  5. };
  6. union Num{
  7.     double lf;
  8.     unsigned char ch[8];
  9. };
  10. int main()
  11. {
  12.     union Data aaa;
  13.     char buf[4]={0x72, 0xF9, 0x31, 0x41};
  14.     int i=0;
  15.     printf("float类型的数据存储,占4个字节,正在读取四个字节……\n");
  16.     for(i=0;i<4;i++)
  17.         aaa.c[i]=buf[i];
  18.     printf("float类型的数据存储,占4个字节。a=%f\n",aaa.a);

  19.     union Num num;
  20.     unsigned char buf1[8]={0xC7, 0x72, 0x6E, 0xBA, 0x35, 0x3F, 0x26, 0x40};
  21.     printf("\ndouble类型的数据存储,占8个字节,正在读取八个字节……\n");
  22.     for(i=0;i<8;i++)
  23.         num.ch[i]=buf1[i];
  24.     printf("double类型的数据存储,占8个字节,num=%lf\n",num.lf);
  25.     return 0;
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-9-28 22:12:54 | 显示全部楼层
这是数字大小端问题,你把上下四个字节移位数换一下就可以了
  1. temp =(unsigned char)buf[count + 7] << 24 | (unsigned char)buf[count + 6] << 16 |
  2.                 (unsigned char)buf[count + 5] << 8 | (unsigned char)buf[count + 4] << 0 |
  3.                 (unsigned char)buf[count + 3] << 56 | (unsigned char)buf[count + 2] << 48 |
  4.                 (unsigned char)buf[count + 1] << 40 | (unsigned char)buf[count + 0] << 32;
复制代码


可以看看我写的这个帖子,直接用一个联合体union就搞定了。把联合体中多余的删掉,只保留float/double和char就可以了,然后把得到的每个字节放进char中,直接读float/double就是对应的数字
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 22:17:07 | 显示全部楼层
  1. #include <stdio.h>

  2. main(void)
  3. {
  4.         union {
  5.                 char c[4]       ;
  6.                 float f         ;
  7.         } un                    ;
  8.         un . c[0] = 0x72        ;
  9.         un . c[1] = 0xF9        ;
  10.         un . c[2] = 0x31        ;
  11.         un . c[3] = 0x41        ;
  12.         printf("%f\n" , un . f) ;
  13. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-28 23:59:10 | 显示全部楼层
来学习
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-29 09:16:31 | 显示全部楼层
sunrise085 发表于 2020-9-28 22:12
这是数字大小端问题,你把上下四个字节移位数换一下就可以了

temp =(unsigned char)buf[count + 7] << 24 | (unsigned char)buf[count + 6] << 16 |
                (unsigned char)buf[count + 5] << 8 | (unsigned char)buf[count + 4] << 0 |
                (unsigned char)buf[count + 3] << 56 | (unsigned char)buf[count + 2] << 48 |
                (unsigned char)buf[count + 1] << 40 | (unsigned char)buf[count + 0] << 32;
scenenavtest_data.match_point_num = *(double *)&temp;
您好,我这样修改了还是输出错误
结果为: -9.25596e+061
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-29 09:49:05 | 显示全部楼层    本楼为最佳答案   
123lll 发表于 2020-9-29 09:16
temp =(unsigned char)buf[count + 7]

你的temp是个什么类型?不会是int吧?int只有4字节,怎么存放八字节内容?buf是什么?char数组?char只有8位,怎么左移这么多位?昨天没有仔细看你的这些变量的类型。。。。
还是直接用联合体吧、直接看我写的那个例程,把多余的内容删掉就可以了

我帮你删除了一下,你可以根据自己需求,再改改
  1. #include <stdio.h>
  2. union Data{
  3.     float a;
  4.     char c[4];
  5. };
  6. union Num{
  7.     double lf;
  8.     unsigned char ch[8];
  9. };
  10. int main()
  11. {
  12.     union Data aaa;
  13.     char buf[4]={0x72, 0xF9, 0x31, 0x41};
  14.     int i=0;
  15.     printf("float类型的数据存储,占4个字节,正在读取四个字节……\n");
  16.     for(i=0;i<4;i++)
  17.         aaa.c[i]=buf[i];
  18.     printf("float类型的数据存储,占4个字节。a=%f\n",aaa.a);

  19.     union Num num;
  20.     unsigned char buf1[8]={0xC7, 0x72, 0x6E, 0xBA, 0x35, 0x3F, 0x26, 0x40};
  21.     printf("\ndouble类型的数据存储,占8个字节,正在读取八个字节……\n");
  22.     for(i=0;i<8;i++)
  23.         num.ch[i]=buf1[i];
  24.     printf("double类型的数据存储,占8个字节,num=%lf\n",num.lf);
  25.     return 0;
  26. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-1 13:54:34 | 显示全部楼层
这个题目看着都头晕

有大师给你解答,还没得到满意答案吗?

我要收藏,需要这些最佳答案,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 16:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表