发一个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的四个字节。
学习一下,对自己有用。
用联合搞定.
union f2c
{
unsigned char ch;
float f;
} 很牛啊。多谢了 AIHHLI 发表于 2013-1-27 22:56用联合搞定.union f2c{
经典 傻孩子书里有相关应用 这能叫数据相互转换吗?存储到数组跟浮点变量虽然值相同,但是所解释的意义不一样啊. 高手别拍我,我是在用float数据需要转换成char型数组时,自己写的一个函数,看看大家是怎么写的,呵呵,如果有更好的方法,我也可以学习学习。 AIHHLI 发表于 2013-1-27 22:56 static/image/common/back.gif
用联合搞定.
union f2c
{
你的方法可能更好,能具体说下吗?谢谢,我也是自己摸索的。 ftoc 函数里面的后三个是不是也应该用uchar float data;
unsigned char cnt;
定义一个联合
union
{
unsigned char ch;
float f;
}f2c;
f2c.f=data;
f2c.ch~f2c.ch,即为data的四个字节。
cooper_ 发表于 2013-1-28 08:36 static/image/common/back.gif
ftoc 函数里面的后三个是不是也应该用uchar
对的,手误 smry 发表于 2013-1-28 08:36 static/image/common/back.gif
float data;
unsigned char cnt;
定义一个联合
嗯 果然是这样,联合体也很神奇!谢谢。 联合体(^_^)路过.。。。 leicai05 发表于 2013-1-28 08:25 static/image/common/back.gif
你的方法可能更好,能具体说下吗?谢谢,我也是自己摸索的。
建议看一下C语言书中对联合的表述部分。
联合中所有变量使用同一个起始地址,而大小为最大的那一个。
但有移植性的问题(大小端)。 AIHHLI 发表于 2013-1-28 21:52 static/image/common/back.gif
建议看一下C语言书中对联合的表述部分。
联合中所有变量使用同一个起始地址,而大小为最大的那一个。
但 ...
谢谢,基本的原理还是明白的,就是平时没这么用。还是见识稍浅,还得加油修炼啊!~~~ 这不叫转换吧,只是共享一个空间而已吧,转出来的东西啥都不是。 神奇的联合体?
搞油量器时用过,也是抄别人的一段程序,那时还不知道叫联合体 收藏下很不错 学习了。 这个方法不错 #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位) mark一下 不错收藏 这样做只是将float用字符的形式表示出来 马克,学习学习 前一段时间刚刚接触用联合体解决的,很神奇 学习了,{:lol:}
页:
[1]