leicai05 发表于 2013-1-27 21:54:28

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

本帖最后由 leicai05 于 2013-1-28 08:49 编辑

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

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

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

xukai871105 发表于 2013-1-27 22:35:19

学习一下,对自己有用。

AIHHLI 发表于 2013-1-27 22:56:34

用联合搞定.
union f2c
{
    unsigned char ch;
    float f;
}

skyformat 发表于 2013-1-27 23:00:38

很牛啊。多谢了

airwolf09921 发表于 2013-1-27 23:54:43

AIHHLI 发表于 2013-1-27 22:56用联合搞定.union f2c{

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

fshunj 发表于 2013-1-28 00:21:45

这能叫数据相互转换吗?存储到数组跟浮点变量虽然值相同,但是所解释的意义不一样啊.

leicai05 发表于 2013-1-28 08:24:11

高手别拍我,我是在用float数据需要转换成char型数组时,自己写的一个函数,看看大家是怎么写的,呵呵,如果有更好的方法,我也可以学习学习。

leicai05 发表于 2013-1-28 08:25:27

AIHHLI 发表于 2013-1-27 22:56 static/image/common/back.gif
用联合搞定.
union f2c
{


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

cooper_ 发表于 2013-1-28 08:36:02

ftoc 函数里面的后三个是不是也应该用uchar

smry 发表于 2013-1-28 08:36:13

float data;
unsigned char cnt;
定义一个联合
union
{
    unsigned char ch;
    float f;
}f2c;

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

leicai05 发表于 2013-1-28 08:44:04

cooper_ 发表于 2013-1-28 08:36 static/image/common/back.gif
ftoc 函数里面的后三个是不是也应该用uchar

对的,手误

leicai05 发表于 2013-1-28 08:46:14

smry 发表于 2013-1-28 08:36 static/image/common/back.gif
float data;
unsigned char cnt;
定义一个联合


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

爱则倾心 发表于 2013-1-28 15:36:47

联合体(^_^)路过.。。。

AIHHLI 发表于 2013-1-28 21:52:53

leicai05 发表于 2013-1-28 08:25 static/image/common/back.gif
你的方法可能更好,能具体说下吗?谢谢,我也是自己摸索的。

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

leicai05 发表于 2013-1-29 10:03:24

AIHHLI 发表于 2013-1-28 21:52 static/image/common/back.gif
建议看一下C语言书中对联合的表述部分。
联合中所有变量使用同一个起始地址,而大小为最大的那一个。
但 ...

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

locky_z 发表于 2013-1-29 10:43:11

这不叫转换吧,只是共享一个空间而已吧,转出来的东西啥都不是。

qqq_147258 发表于 2013-1-29 15:44:20

神奇的联合体?

qd118118 发表于 2013-1-29 15:50:15

搞油量器时用过,也是抄别人的一段程序,那时还不知道叫联合体

凌晨一点 发表于 2013-2-2 02:44:47

收藏下很不错

aworker 发表于 2013-2-2 08:08:43

学习了。

gumogumo 发表于 2013-2-2 08:26:33

这个方法不错

xukai871105 发表于 2013-2-19 21:02:57

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef union
{
uint8_t CharArray;
uint16_t IntArray;
float FloatValue;
}Float2Array_TypeDef;

Float2Array_TypeDef Float2Array;

int main(void)
{
Float2Array.FloatValue = 1.11;
printf("float:%.2f\n",Float2Array.FloatValue);
printf("Char Array:%02x,%02x,%02x,%02x\n",\
                                    Float2Array.CharArray,\
                                    Float2Array.CharArray,\
                                    Float2Array.CharArray,\
                                    Float2Array.CharArray);

printf("Int Array:%04x,%04x\n",Float2Array.IntArray,Float2Array.IntArray);
return EXIT_SUCCESS;
}
运行结果
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位)

xiaohuixh 发表于 2013-2-19 21:25:04

mark一下

32MCU 发表于 2013-2-19 22:02:14

不错收藏

天使之翼 发表于 2013-2-20 00:08:20

这样做只是将float用字符的形式表示出来

shin555 发表于 2013-2-20 08:03:17

马克,学习学习

让爱随风 发表于 2013-2-20 08:47:42

前一段时间刚刚接触用联合体解决的,很神奇

棋间卒 发表于 2013-2-20 09:07:00

学习了,{:lol:}
页: [1]
查看完整版本: 发一个float和char型数据的相互转换