搜索
bottom↓
回复: 27

发一个float和char型数据的相互转换

[复制链接]

出0入0汤圆

发表于 2013-1-27 21:54:28 | 显示全部楼层 |阅读模式
本帖最后由 leicai05 于 2013-1-28 08:49 编辑

//float 转化成uchar
//data:是需要转换的float
//cnt:是转化后的数组
void ftoc(float data,uchar *cnt)
{
   cnt[0] = *((uchar *)(&data));
   cnt[1] = *((uchar *)(&data)+1);
   cnt[2] = *((uchar *)(&data)+2);
   cnt[3] = *((uchar *)(&data)+3);  
}
//char合并成float
float ctof(uchar *cnt)
{
   float data;
   data = *((float *)cnt);   
   return data;
}

楼下的高手也有用联合体实现的,也复制过来方便大家浏览吧。
float data;
unsigned char cnt[4];
定义一个联合
union
{
    unsigned char ch[4];
    float f;
}f2c;

f2c.f=data;
f2c.ch[0]~f2c.ch[3],即为data的四个字节。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-1-27 22:35:19 来自手机 | 显示全部楼层
学习一下,对自己有用。

出0入0汤圆

发表于 2013-1-27 22:56:34 | 显示全部楼层
用联合搞定.
union f2c
{
    unsigned char ch[4];
    float f;
}

出0入0汤圆

发表于 2013-1-27 23:00:38 | 显示全部楼层
很牛啊。多谢了

出0入0汤圆

发表于 2013-1-27 23:54:43 来自手机 | 显示全部楼层
AIHHLI 发表于 2013-1-27 22:56  用联合搞定.  union f2c  {

经典 傻孩子书里有相关应用

出0入0汤圆

发表于 2013-1-28 00:21:45 来自手机 | 显示全部楼层
这能叫数据相互转换吗?存储到数组跟浮点变量虽然值相同,但是所解释的意义不一样啊.

出0入0汤圆

 楼主| 发表于 2013-1-28 08:24:11 | 显示全部楼层
高手别拍我,我是在用float数据需要转换成char型数组时,自己写的一个函数,看看大家是怎么写的,呵呵,如果有更好的方法,我也可以学习学习。

出0入0汤圆

 楼主| 发表于 2013-1-28 08:25:27 | 显示全部楼层
AIHHLI 发表于 2013-1-27 22:56
用联合搞定.
union f2c
{

你的方法可能更好,能具体说下吗?谢谢,我也是自己摸索的。

出0入10汤圆

发表于 2013-1-28 08:36:02 来自手机 | 显示全部楼层
ftoc 函数里面的后三个是不是也应该用uchar

出0入0汤圆

发表于 2013-1-28 08:36:13 | 显示全部楼层
float data;
unsigned char cnt[4];
定义一个联合
union
{
    unsigned char ch[4];
    float f;
}f2c;

f2c.f=data;
f2c.ch[0]~f2c.ch[3],即为data的四个字节。

出0入0汤圆

 楼主| 发表于 2013-1-28 08:44:04 | 显示全部楼层
cooper_ 发表于 2013-1-28 08:36
ftoc 函数里面的后三个是不是也应该用uchar

对的,手误

出0入0汤圆

 楼主| 发表于 2013-1-28 08:46:14 | 显示全部楼层
smry 发表于 2013-1-28 08:36
float data;
unsigned char cnt[4];
定义一个联合

嗯 果然是这样,联合体也很神奇!谢谢。

出0入0汤圆

发表于 2013-1-28 15:36:47 来自手机 | 显示全部楼层
联合体(^_^)路过.。。。

出0入0汤圆

发表于 2013-1-28 21:52:53 | 显示全部楼层
leicai05 发表于 2013-1-28 08:25
你的方法可能更好,能具体说下吗?谢谢,我也是自己摸索的。

建议看一下C语言书中对联合的表述部分。
联合中所有变量使用同一个起始地址,而大小为最大的那一个。
但有移植性的问题(大小端)。

出0入0汤圆

 楼主| 发表于 2013-1-29 10:03:24 | 显示全部楼层
AIHHLI 发表于 2013-1-28 21:52
建议看一下C语言书中对联合的表述部分。
联合中所有变量使用同一个起始地址,而大小为最大的那一个。
但 ...

谢谢,基本的原理还是明白的,就是平时没这么用。还是见识稍浅,还得加油修炼啊!~~~

出0入0汤圆

发表于 2013-1-29 10:43:11 | 显示全部楼层
这不叫转换吧,只是共享一个空间而已吧,转出来的东西啥都不是。

出0入0汤圆

发表于 2013-1-29 15:44:20 | 显示全部楼层
神奇的联合体?

出0入21汤圆

发表于 2013-1-29 15:50:15 | 显示全部楼层
搞油量器时用过,也是抄别人的一段程序,那时还不知道叫联合体

出0入0汤圆

发表于 2013-2-2 02:44:47 来自手机 | 显示全部楼层
收藏下很不错

出0入0汤圆

发表于 2013-2-2 08:08:43 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2013-2-2 08:26:33 | 显示全部楼层
这个方法不错

出0入0汤圆

发表于 2013-2-19 21:02:57 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>

  4. typedef union
  5. {
  6.   uint8_t CharArray[4];
  7.   uint16_t IntArray[2];
  8.   float FloatValue;
  9. }Float2Array_TypeDef;

  10. Float2Array_TypeDef Float2Array;

  11. int main(void)
  12. {
  13.   Float2Array.FloatValue = 1.11;
  14.   printf("float:%.2f\n",Float2Array.FloatValue);
  15.   printf("Char Array:%02x,%02x,%02x,%02x\n",\
  16.                                     Float2Array.CharArray[0],\
  17.                                     Float2Array.CharArray[1],\
  18.                                     Float2Array.CharArray[2],\
  19.                                     Float2Array.CharArray[3]);

  20.   printf("Int Array:%04x,%04x\n",Float2Array.IntArray[0],Float2Array.IntArray[1]);
  21.   return EXIT_SUCCESS;
  22. }
复制代码
运行结果
float:1.11
Char Array:7b,14,8e,3f
Int Array:147b,3f8e

测试编译器 MinGW(小端模式,低字节位于低地址)

在内存中数据的存放顺序(低地址在前) 7b,14,8e,3f
这个好理解,如果以uint16来排序的话,存放顺序为(低地址在前)147b,3f8e
请注意此时不是7b14,8e3f(第0个字节为整型的低8位,第1个字节为整型的高8位)

出0入0汤圆

发表于 2013-2-19 21:25:04 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2013-2-19 22:02:14 来自手机 | 显示全部楼层
不错收藏

出255入0汤圆

发表于 2013-2-20 00:08:20 来自手机 | 显示全部楼层
这样做只是将float用字符的形式表示出来

出0入0汤圆

发表于 2013-2-20 08:03:17 来自手机 | 显示全部楼层
马克,学习学习

出0入0汤圆

发表于 2013-2-20 08:47:42 | 显示全部楼层
前一段时间刚刚接触用联合体解决的,很神奇

出0入0汤圆

发表于 2013-2-20 09:07:00 | 显示全部楼层
学习了,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 08:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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