16进制转换浮点数之指针强制转换法

16进制和浮点数互转,目前我会的知道的就两种方式,一种是联合体的方式,还有一种就是指针强制转换的方式。下面的是指针强制转换的C语言实现方式,如果接收的浮点数据是通过外部接收过来的,浮点的16进制数据的排列会跟硬件平台的大小端相关,需要调整排列顺序,再用指针转换。

//****输入单精度浮点数:3.141593 转成十六进制: 40 49 0F DA***//
uint8_t f_buf[4]={0};
float f_Value1=3.1415926;		//浮点数1
float f_value2=0;			//浮点数2
uint8_t *float_p;

void user_main(void)
{
	    float_p=(uint8_t *)&f_Value1;       //指针指向浮点数1
	    f_buf[0]=*(float_p+0);              //将浮点数的值转换为4字节数存入数组
	    f_buf[1]=*(float_p+1);
	    f_buf[2]=*(float_p+2);
	    f_buf[3]=*(float_p+3);
	    float_p=f_buf;                      //指针再指向数组
	    f_value2=*((float *)(float_p));     //将指针指向的数据转解为浮点数2
	    while(1)
	    {
	    }
}
C语言中,将16进制字符串转换浮点数可以分为两步:首先将16进制字符串解析成整数,然后将这个整数转换浮点数。下面是一个简单的示例,假设我们有一个指向16进制字符串的指针: ```c #include <stdio.h> #include <string.h> #include <math.h> // 函数声明 float hex_to_float(const char *hex); int main() { const char *hex_str = "1.abcdef"; // 16进制小数字符串 float decimal = hex_to_float(hex_str); printf("Hex to Float: %f\n", decimal); // 输出转换后的浮点数 return 0; } // 将16进制字符串转换浮点数的函数 float hex_to_float(const char *hex) { int num = 0; // 存储16进制数值 char* endptr; // 遍历并转换每个字符到10进制 for (const char *s = hex; s && isxdigit(*s); ++s) { num = num * 16 + (*s - '0'); // 如果是数字 if (*s >= 'a' && *s <= 'f') { // 如果是字母(A-F) num = num * 16 + (*s - 'a' + 10); // 添加相应的值 } } // 如果字符串不是有效的16进制,则num会保持初始值0,此时设置endptr为NULL表示错误 endptr = strchr(hex, '.') ? &hex[strlen(hex)] : NULL; // 使用strtod函数将16进制数值转换为double类型的浮点数 double float_num = strtod(hex, &endptr); // 如果endptr没改变,说明转换成功 if (endptr == hex || !*endptr) { float_num /= 10.0; // 因为最后一位通常代表小数点后的一个零,除以10消除这个零 return (float)float_num; // 将double转换回float类型 } else { // 错误处理,例如输入包含非数字字符 printf("Invalid hexadecimal number format.\n"); return NAN; // 返回Not-a-Number,表示无转换 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值