#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码,如有需要可留言我再发。
将BCD码转化成10进制数,并按照低位到高位的形式组合在一起。例如0x23和0x45 转化成 十进制4523
/*******************************************************************************
* @file pow.c
* @verison v1.0.0
* @copyright COPYRIGHT © 2020 CSG
* @autho
将手机号码或加密后的字符串进行BCD编码后在网络上传输,如果有大量此类型的数据,可以减少传输的数据量。该算法针对字符串中含“0123456789abcdefABCDEF”字符串进行BCD编码。1.[代码][C/C++]代码#include #include int strTobcd(unsigned char *dest, const char *src){int i;unsigned char ...
if(BCD_Data > 0 && BCD_Data <= 99)
return ( (BCD_Data / 10 * 16) + (BCD_Data % 10) );
return 0;
uint16_t DX_to_HX(uint16_t DX_Data)
return (((DX_Data / 1
程序中有时会遇到时间的读取,会涉及到BCD码和ASCII码的转换,下面的程序会解决这个问题,Uint8类型就是unsigned char数据类型
Uint8 bcd_to_hex(Uint8 data)
Uint8 temp;
temp = ((data>>4)*10 + (data&0x0f));
return temp;
Uint8 hex_to_bcd(Uint8 data)
Uint8 temp;
temp = (((d
在写程序时,经常需要进行BCD码和ASCII码的转换,下面是我常用的转换程序,如果大家有需要,直接调用就行了,呵呵!unsigned char BCD2HEX(unsigned char bcd_data) //BCD转为HEX子程序 { unsigned char temp; temp=(bcd_data/16*10 + bcd_data%16);
// BCD 码 转 十进制
#define BCD_TO_DECIMAL(x) ((((x) & 0xf0) >> 4) * 10 + ((x) & 0x0f))
// 十进制 转 BCD 码
#define DECIMAL_TO_BCD(x) ((((x) / 10) << 4) + ((x) % 10))
* \brief 十六进制转bcd 用于把时
关于这类算法,以前的文章已经讲过类似的:BCD码转二进制#include // HEX转BCD//bcd_data(<0x255,>0)unsigned char BCD2HEX(unsigned int bcd_data){unsigned char temp;temp=((bcd_data>>8)*100)|((bcd_data>>4)*10)|(bcd_d...