一.简述

  使用BCD编码方式可以更大限度的节省字节空间,使用四位二进制保存一个十进制数。本文完成了float型数据转换为BCD编码方式的转换,并且根据保留小数点后的位数做出对应的转换。

二.代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 /**
 * @brief   将float转为bcd
 *
 * @param   input:输入的float型数据
 *          decimal_num:要保留的小数位数
 * 	    output_buf:输出缓存区
 * 	    output_num:最终转换输出字节数
 *
 * @return  void
 *
 */
void float_to_bcd(const float input, int decimal_num, char* output_buf,int *output_num)
{
	 int i = 0;
	 int len_temp = 0;
	 int len_final = 0; 	 //最中组成的strbuf长度
	 char string_buffer[20] = {0};  //定义临时缓存区
	 //根据保留的小数位数做不同操作
	 switch (decimal_num)
	 {
		 case 0:
		  sprintf_s(string_buffer, "%.0f", input);   //将输入的float型变量进行格式化输出
		  break;
		 case 1:
		  sprintf_s(string_buffer, "%.2f", input);   //将输入的float型变量进行格式化输出
		  len_temp = strlen(string_buffer);          //获取格式化后的数据长度
		  memmove(string_buffer + len_temp - 3, string_buffer + len_temp - 2, 1);   //内存移动,可以重叠
		  string_buffer[len_temp - 2] = 0;   //添加结束符
		  break;
		 case 2://两位小数部分
		  sprintf_s(string_buffer, "%.3f", input);   //将输入的float型变量进行格式化输出
		  len_temp = strlen(string_buffer);         //获取格式化后的数据长度
		  memmove(string_buffer + len_temp - 4, string_buffer + len_temp - 3, 2);   //内存移动,可以重叠
		  string_buffer[len_temp - 2] = 0;    //添加结束符
		  break;
		 case 3:
		  sprintf_s(string_buffer, "%.4f", input);   //将输入的float型变量进行格式化输出
		  len_temp = strlen(string_buffer);         //获取格式化后的数据长度
		  memmove(string_buffer + len_temp - 5, string_buffer + len_temp - 4, 3);   //内存移动,可以重叠
		  string_buffer[len_temp - 2] = 0;   //添加结束符
		  break;
		 default:break;
	 }
			
	 len_final = strlen(string_buffer);
	 printf("len_final = %d   string_buffer = %s\n", len_final, string_buffer);
	 //string到BCD的转换
	 if (len_final % 2)   //一共有奇数位
	 {
		  output_buf[0] = string_buffer[0] - '0';
		  for (i = 0; i < (len_final - 1) / 2; i++)
		  {
		   output_buf[i + 1] = (string_buffer[2 * i + 1] - '0') << 4 | (string_buffer[2 * i + 2] - '0');
		  }
	}
	 else   //一共有偶数位
	 {
	  	for (i = 0; i < len_final / 2; i++)
	  	{
	   		output_buf[i] = (string_buffer[2 * i] - '0') << 4 | (string_buffer[2 * i + 1] - '0');
	  	}
	 }
	 *output_num = len_final % 2 + len_final / 2;   //获取最终产生的字节数
}
int main(void)
{
 	int i = 0;
 	int len_final = 0;
 	float a = 12142.01023;
 	char bcd_buffer[10];
 	//float_to_bcd(a, 0, bcd_buffer, &len_final);    //保留0位小数
 	//float_to_bcd(a, 1, bcd_buffer, &len_final);    //保留1位小数
 	//float_to_bcd(a, 2, bcd_buffer, &len_final);    //保留2位小数
 	float_to_bcd(a, 3, bcd_buffer, &len_final);      //保留3位小数
 	for (i = 0; i < len_final; i++)
 	{
  		printf("%x ", bcd_buffer[i]);
 	}
 	return 0;
}

三.执行结果

//保留0位小数
len_final = 5   string_buffer = 12142
输出的BCD数据:01 21 42
//保留1位小数
len_final = 6   string_buffer = 121420
输出的BCD数据:12 14 20
//保留2位小数
len_final = 7   string_buffer = 1214201
输出的BCD数据:01 21 42 01
//保留3位小数
len_final = 8   string_buffer = 12142009
输出的BCD数据:12 14 20 09
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐