如题
- 最近因项目需要将BCD码数据转成HEX格式而编写,大小端概念相关知识自行补充即可。
- 输出的十进制数
hexindec_val
可满足所有32位数可表达的bcd_data
输入转换
- 输出的十六进制数组
hex_data
可满足32位和64位数可表达的hex_data
输入转换
- 输入:
- 存放大端格式HEX数据的缓冲区指针
- 小端格式BCD数据缓冲区指针
- BCD数据长度
- 输出:
- 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
*hex_data
缓冲区大小要放得下最后memmove
进去的数据,可能比输入参数3data_len
大。
- 输入参数1
*hex_data
和参数2*bcd_data
的大小端排列还需看使用者机器类型,我使用的是小端排列的设备,如果不同还需调整输入时的数据格式或循环的逻辑。
- 程序相当于有两个输出结果
return
的hexindec_val
十进制表示
memmove
的hex_data
十六进制表示
- 无论是
memmove
进去的还是输入数据的格式都一定要看 使用者的机器属于大小端哪种!
- 同时编写的还有HEX转BCD码,如有需要可留言我再发。