相关文章推荐
孤独的铁链  ·  Python MySQL – ...·  1 年前    · 
焦虑的柑橘  ·  QT/VS + C++ ...·  1 年前    · 
  • 最近因项目需要将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码,如有需要可留言我再发。
    BCD码化成10进制数,并按照低位到高位的形式组合在一起。例如0x23和0x45 化成 十进制4523 /******************************************************************************* * @file pow.c * @verison v1.0.0 * @copyright COPYRIGHT &copy; 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) //BCDHEX子程序 { 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 // HEXBCD//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...