C语言实现ASCII字符、压缩BCD码值与BIN码(16进制)互转 - (已编译,亲试可用)

  • 目录

    • 1、将压缩BCD码转为BIN码
    • 2、将压缩BCD码数组转为BIN码数组
    • 3、将BIN码转为压缩BCD码
    • 4、将BIN码数组转为压缩BCD码数组
    • 5、将ASCII码转为BIN码
    • 6、将ASCII码(字符串)转为BIN码数组
    • 7、将BIN码转为 ASCII码
    • 8、将BIN码数组转为ASCII码(字符串)
    • 9、将 ASCII码(字符串)转换为 压缩 BCD 码
    • 10、将 压缩 BCD 码数组 转换为 ASCII码(字符串)
  • 1、将压缩BCD码转为BIN码

    (举例: BCD码 0x56 → 10进制 56 → BIN码 0x38)
    /***************************
    函数名:   BcdToBin
    功能描述: 将 BCD码转为 BIN码
    参数:    BCD码
    返回:    BIN码
    ***************************/
    uint8_t BcdToBin(uint8_t bBcd)
    {
    	uint8_t bBin;
    	bBin = (((bBcd >> 4) & 0x0F) * 10 ) + (bBcd & 0x0F);
    	
    	return bBin;
    }
    
    
  • 2、将压缩BCD码数组转为BIN码数组

    (举例: BCD码数组 {0x12, 0x34, 0x56, 0x78} → 10进制 12345678 → BIN码数组 {0x00, 0xBC, 0x61, 0x4E})
    /***************************
    函数名:   BcdArrayToBinArray
    功能描述: 将BCD码数组转为BIN码数组
    参数:    pBcd:转换前的BCD码数组,
    	     pBin:转换后的BIN码数组,
    	     len:代转换的数组长度
    	     
    注意:此函数支持的最大转换数组长度为 8
    ***************************/
    void BcdArrayToBinArray(uint8_t *pBin, uint8_t *pBcd, uint8_t len)
    {
    	uint8_t i, j = 0;
    	uint8_t Calclen = 0;
    	uint8_t BinArr[8] = {0};
    	uint64_t BinTemp = 0;
    	uint64_t Cnt10x = 1;
    	
    	for(i = 0; i < len; i++)
    	{
    		Cnt10x = 1;
    		Calclen = ((len - i - 1) * 2);
    		for(j = 0; j < Calclen; j++)
    		{
    			Cnt10x *= 10;
    		}
    		BinTemp += (BcdToBin(pBcd[i]) * Cnt10x);  // 此处 BinTemp 值为 0x00BC614E
    	}
    	
    	memcpy(BinArr, &BinTemp, len);	              // 将BIN数据拆分为BIN码数组(此时数组高低位是相反的)
    	
    	for(i = 0; i < len; i++)
    	{
    		pBin[i] = BinArr[len - 1 - i];		      // 将数组进行高低位转换
    	}
    }
    
    
  • 3、将BIN码转为压缩BCD码

    (举例: BIN码 0x38 → 10进制 56 → BCD码 0x56)
    /***************************
    函数名:   BinToBcd
    功能描述: 将 16进制数据转为 BCD码
    参数:    Bin码
    返回:    BCD码
    ***************************/
    uint8_t BinToBcd(uint8_t bBin)
    {
    	uint8_t bBcd;
    	bBcd = ((bBin / 10) * 16) + (bBin % 10);
    	
    	return bBcd;
    }
    
    
  • 4、将BIN码数组转为压缩BCD码数组

    (举例: BIN码数组{0x49, 0x96, 0x02, 0xD2} → 10进制1234567890 → BCD码数组{0x12, 0x34, 0x56, 0x78, 0x90})
    /***************************
    函数名:   BinArrayToBcdArray
    功能描述: 将 BIN码数组转为 BCD码数组
    参数:    pBin:转换前的 BIN码数组,
             pBcd:转换后的 BCD码数组,
             len:待转换的数组长度
    返回:   转换后得到 BCD码数组的有效数据长度
    
    注意:待转换的 BIN码数组对应的 10进制值不能大于 9999 9999 9999 9999  
    ***************************/
    uint8_t BinArrayToBcdArray(uint8_t *pBcd, uint8_t *pBin, uint8_t len)
    {
    	uint8_t i, j, k = 0;
    	uint8_t Calclen, temp = 0;
    	uint64_t BinTemp = 0;
    	uint64_t Cnt10x = 1;
    	
    	for(i = 0; i < len; i++)
    	{
    		BinTemp += (pBin[i] << ((len - i - 1) * 8));	// 将BIN数组转为整型数据
    	}
    	
    	k = 0;
    	for(i = 0; i < 8; i++)
    	{
    		Cnt10x = 1;
    		Calclen = ((8 - i - 1) * 2);
    		for(j = 0; j < Calclen; j++)
    		{
    			Cnt10x *= 10;
    		}
    		temp = BinTemp / Cnt10x;
    		BinTemp %= Cnt10x;
    		if(temp > 0 || k > 0)
    		{
    			pBcd[k] = HexToBcd(temp);
    			k++;
    		}
    	}	
    	return k;      // 转换后得到 BCD码数组的有效数据长度
    }
    
    
  • 5、将ASCII码转为BIN码

    (举例:ASCII码’3’ → 10进制3 → BIN码0x03)
    /***************************
    函数名:   AsciiToBin
    功能描述: 将 ASCII码转为 BIN码
    参数:    Ascii码
    返回:    Bin码
    ***************************/
    uint8_t AsciiToBin(uint8_t bAscii)
    {
    	uint8_t bHex;
    	bHex = bAscii - '0';
    	
    	return bHex;
    }
    
    
  • 6、 将ASCII码(字符串)转为BIN码数组

    (举例: ASCII码(字符串)“1234567890” → 10进制1234567890 → BIN码数组{0x49, 0x96, 0x02, 0xD2})
    /***************************
    函数名:   AsciiArrayToBinArray
    功能描述: 将 ASCII码(字符串)转为 BIN码数组
    参数:    pAscii:转换前的 ASCII码(字符串),
             pBin:转换后的 BIN码数组,
             len:待转换的字符串长度
    返回:   转换后得到 BIN码数组的有效数据长度
    
    注意:转换后的 BIN数组最大长度为 8
    ***************************/
    uint8_t AsciiArrayToBinArray(uint8_t *pBin, uint8_t *pAscii, uint8_t len)
    {
    	uint8_t i, j, k = 0;
    	uint8_t Calclen, temp = 0;
    	uint8_t BinArr[8] = {0};
    	uint64_t BinTemp = 0;
    	uint64_t Cnt10x = 1;
    	
    	for(i = 0; i < len; i++)
    	{
    		Cnt10x = 1;
    		Calclen = len - i - 1;
    		for(j = 0; j < Calclen; j++)
    		{
    			Cnt10x *= 10;
    		}
    		BinTemp += (pAscii[i] - '0') * Cnt10x;
    	}
    	
    	memcpy(BinArr, &BinTemp, 8);
    	k = 0;
    	for(i = 0; i < 8; i++)
    	{
    		temp = BinArr[8 - 1 - i];
    		if(temp > 0 || k > 0)
    		{
    			pBin[k] = temp;
    			k++;
    		}
    	}	
    	return k;      // 转换后得到 BIN码数组的有效数据长度
    }
    
  • 7、将 BIN码转为 ASCII码

    (举例:BIN码0x03 → 10进制3 → ASCII码’3’)
    /***************************
    函数名:   BinToAscii
    功能描述: 将 BIN码转为 ASCII码
    参数:    Bin码
    返回:    Ascii码
    
    注意:此处代转换的 BIN码对应的十进制值不能大于9
    ***************************/
    uint8_t BinToAscii(uint8_t bBin)
    {
    	uint8_t bAscii;
    	bAscii = bBin + '0';
    	
    	return bAscii;
    }
    
    
  • 8、将BIN码数组转为ASCII码(字符串)

    (举例: BIN码数组{0x49, 0x96, 0x02, 0xD2} → 10进制1234567890 → ASCII码(字符串)“1234567890”)
    /***************************
    函数名:   BinArrayToAsciiArray
    功能描述: 将 BIN码数组转为 ASCII码(字符串)
    参数:    pBin:转换前的 BIN码数组,
             pAscii:转换后的 ASCII码(字符串),
             len:待转换的 BIN码数组
    返回:   转换后得到 ASCII码(字符串)有效长度
    
    注意:转换前的 BIN数组最大长度为 7
    ***************************/
    uint8_t BinArrayToAsciiArray(uint8_t *pAscii, uint8_t *pBin, uint8_t len)
    {
    	uint8_t i, k, Flag = 0;
    	uint8_t AsciiArr[20] = {0};
    	uint64_t BinTemp = 0;
    	uint64_t temp1, temp2 = 0;
    		
    	for(i = 0; i < len; i++)
    	{
    		BinTemp += (pBin[i] << ((len - i - 1) * 8));					// 将BIN数组转为整型数据
    	}
    	
    	k = 0;
    	Flag = 0;
    	while(Flag == 0)
    	{
    		temp1 = BinTemp / 10;
    		if(temp1 != 0)
    		{
    			temp2 = BinTemp % 10;
    			BinTemp = temp1;
    			AsciiArr[k] = temp2 + 0x30;
    			k++;
    		}
    		else if(k == 0)
    		{
    			pAscii[k] = '0';
    			k++;
    			Flag = 1;
    		}
    		else
    		{
    			AsciiArr[k] = BinTemp + 0x30;
    			k++;
    			for(i = 0; i < k; i++)
    			{
    				pAscii[i] = AsciiArr[k - 1 - i];
    			}
    			Flag = 1;
    		}
    	}
    	return k;						// 转换后得到 ASCII码数组的有效数据长度
    }
    
  • 9、将 ASCII码(字符串)转换为 压缩 BCD 码

    (举例 :ASCII码(字符串)‘123456’ 转为 压缩 BCD 码0x12 0x34 0x56)
    /***************************
    函数名:    AsciiArrayToBcdArray
    功能描述:  ASCII码(字符串)转换为 压缩 BCD 码数组
    参数:     pAscii:转换前的 ASCII码(字符串)
    	      pBcd:转换后的 压缩 BCD 码数组
    
    注意:此处代转换的 ASCII码(字符串)长度为偶数
    ***************************/
    void AsciiArrayToBcdArray(uint8_t *pBcd, uint8_t *pAscii, uint8_t len)
    {
    	uint8_t i;
    	for(i = 0; i < len; i++)
    	{
    		*pBcd =  (*pAscii++ - '0') << 4;
    		*pBcd += (*pAscii++ - '0');    
    		
    		pBcd++;
    	}
    }
    
    
  • 10、将 压缩 BCD 码数组 转换为 ASCII码(字符串)

    (举例 :压缩 BCD 码0x12 0x34 0x56 转为 ASCII码(字符串)‘123456’)
    /***************************
    函数名:    BcdArrayToAsciiArray
    功能描述:  将 压缩 BCD 码数组 转换为 ASCII码(字符串)
    参数:     pAscii:转换后的 ASCII码(字符串)
    	      pBcd:转换前的 压缩 BCD 码数组
    ***************************/
    void BcdArrayToAsciiArray(uint8_t *pAscii, uint8_t *pBcd, uint8_t len)
    {
    	uint8_t i;
    	for(i = 0; i < len; i++)
    	{
    		*pAscii++ = ((*pBcd >> 4) & 0x0f) + '0';
    		*pAscii++ = (*pBcd & 0x0f) + '0';    
    		
    		pBcd++;
    	}
    }
    
    
  • 3
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的小肥丸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值