BCD码转HEX(C语言)

如题

  • 最近因项目需要将BCD码数据转成HEX格式而编写,大小端概念相关知识自行补充即可
  • 输出的十进制数hexindec_val可满足所有32位数可表达的bcd_data输入转换
  • 输出的十六进制数组hex_data可满足32位和64位数可表达的hex_data输入转换

  • 输入
    1. 存放大端格式HEX数据的缓冲区指针
    2. 小端格式BCD数据缓冲区指针
    3. BCD数据长度
  • 输出
    1. HEX数据十进制表示

代码实现:

#include <stdio.h>
#include <string.h>
#include <math.h>

typedef unsigned long long	uint64_t;
typedef unsigned int		uint32_t;
typedef unsigned short		uint16_t;
typedef unsigned char		uint8_t;

uint64_t BCD2HEX(uint8_t *hex_data, uint8_t *bcd_data, uint8_t data_len)
{
	uint8_t index = 0, pow_num = 0, move_cnt = 0;
    uint8_t res = 0x0f;
	uint64_t hexindec_val = 0;

	if (!data_len || (data_len > sizeof(uint64_t)))
	{
		return hexindec_val; 
	}
	for (index = 0; index < data_len; index++)
	{
		move_cnt = 0;
        
		for (pow_num = index; pow_num < (2 + index); pow_num++)
		{
			hexindec_val += (((bcd_data[index] & res) >> (4 * move_cnt)) * pow(10, index + pow_num));
            
			res ^= 0xff;
			move_cnt++;
		}
	}
    memmove(hex_data, &hexindec_val, data_len);

	return hexindec_val;
}

示例

在这里插入图片描述

  • 第一行打印-1因为printf默认了有符号,左侧可看到变量值为0XFFFFFFFF的十进制表达
  • 由此可验证32位输入的BCD码都可转换,同样方法可验证64位依然可以

注意

  1. 输入参数1*hex_data缓冲区大小要放得下最后memmove进去的数据,可能比输入参数3data_len大。
  2. 输入参数1*hex_data和参数2*bcd_data的大小端排列还需看使用者机器类型,我使用的是小端排列的设备,如果不同还需调整输入时的数据格式或循环的逻辑。
  3. 程序相当于有两个输出结果
    • returnhexindec_val十进制表示
    • memmovehex_data十六进制表示
  4. 无论是memmove进去的还是输入数据的格式都一定要看 使用者的机器属于大小端哪种!
  5. 同时编写的还有HEX转BCD码,如有需要可留言我再发。
发布了22 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Emmy_kanly/article/details/103780028
今日推荐