BCD编码的数据与基本类型数据之间的转换

本文介绍BCD编码与基本数据类型之间的转换方法,包括字符、短整型及字符串到长整型的转换实现,并提供了C语言示例代码。
/***********************************************************************
BCD编码的数据与基本类型数据之间的转换:
BCD码亦称二进码十进数或二-十进制码,用4位二进数来表示1位十进数中的0~9
这10个数码,8421BCD码是最常用的BCD码,只选用4位二进制码中的前10组代码,
即用0000~1001,来分别表示它所对应的十进制数,而余下的六组代码不用。
************************************************************************/
#include <stdio.h>


unsigned char CharToBCD(unsigned char hex)
{
	unsigned char bcd;
	
	bcd = ((hex>>4) & 0x0F) * 10;
	bcd += hex & 0x0F;
	
	return bcd;
}


unsigned char BCDToChar(unsigned char bcd)
{
	unsigned char hex;
	
	hex = (bcd/10) * 16 + (bcd%10);
	
	return hex;
}


unsigned short BCDToShort(unsigned short bcd)
{
	unsigned short myshort = 0;
	
	myshort = ((bcd>>12) & 0x0F) *1000 + ((bcd>>8) & 0x0F) *100 + ((bcd>>4) & 0x0F) *10 + (bcd & 0x0F);
	
	return myshort;
}


unsigned short ShortToBCD(unsigned short ust)
{
	unsigned short bcd = 0;
	
	bcd = (ust/1000) * 4096 + ((ust%1000)/100) * 256 + ((ust%100)/10) * 16 + (ust%10);
	
	return bcd;
}


unsigned long StringToLong(unsigned char *String)
{
	unsigned long Long;
	
	Long = (String[0]-'0')*10000000+(String[1]-'0')*1000000+(String[2]-'0')*100000+(String[3]-'0')*10000\
		+(String[4]-'0')*1000+(String[5]-'0')*100+(String[6]-'0')*10+(String[7]-'0');
    
	return Long;
}


int main(int argc, char *argv[])
{
	unsigned char src_hex = 0x29;
	unsigned char tar_bcd = 0;
	unsigned char tar_hex = 0;
	
	unsigned short us_src_bcd = 0x4367;
	unsigned short us_tar_bcd = 0;
	unsigned short us_tar_hex = 0;
	
	char str[9] = "12345678";
	unsigned long ul_tar = 0;


	
	tar_bcd = CharToBCD(src_hex);
	printf("src_hex:%02X tar_bcd:%02X = %d\n",src_hex,tar_bcd,tar_bcd);


	tar_hex = BCDToChar(tar_bcd);
	printf("tar_bcd:%02X tar_hex:%02X\n",tar_bcd,tar_hex);
	
	us_tar_hex = BCDToShort(us_src_bcd);
	printf("us_src_bcd:%02X us_tar_hex:%02X\n",us_src_bcd,us_tar_hex);
	
	us_tar_bcd = ShortToBCD(us_tar_hex);
	printf("us_tar_hex:%02X us_tar_bcd:%02X = %d\n",us_tar_hex,us_tar_bcd,us_tar_bcd);
	
	ul_tar = StringToLong(str);
	printf("str:%s ul_tar:%d\n",str,ul_tar);
	
	return 0;
}

好的,让我为你解释一下如何将十进制数转换BCD (Binary-Coded Decimal) 码。 ### 什么是 BCD 码? BCD 码是一种编码方式,用于将每个十进制数字(0到9)表示为4位二进制数。例如: - 十进制 `5` 的BCD码是 `0101` - 十进制 `9` 的BCD码是 `1001` 因此,对于一个多于一位的十进制数如`127`, 它的BCD表示将是每一位单独化为4位二进制的结果组合起来: - `1`: `0001` - `2`: `0010` - `7`: `0111` 所以最终结果就是 `0001 0010 0111`. ### C语言实现 下面是一个简单的C程序示范了怎样把一个整型变量包含的一个非负十进制值成它的等价BCD形式: ```c #include <stdio.h> #define BYTE unsigned char // 使用宏定义简化代码书写 void dec_to_bcd(int decimal, BYTE *bcd_array){ int i = 0; do{ bcd_array[i++] = decimal % 10; /* 提取最后一位并存储 */ decimal /= 10; /* 去掉已经处理过的最低有效位 */ if(decimal == 0 && i%2 != 0){ /* 如果需要保持偶数长度则填充零 */ bcd_array[i] = 0; i++; } }while(decimal > 0); } int main(){ int num = 8396; BYTE arr[10]; //假设最大不会超过10个十进制数 printf("原始十进制数值:%d\n",num); dec_to_bcd(num,arr); // 调用函数完成转换 for(int j=sizeof(arr)/sizeof(BYTE)-1;j>=0;j--){ if((arr[j]&0xF0)==0x00) continue; else { printf("%X ",(arr[j])); if(j>0)// 打印空格分隔符但是最后一个字符前不需要加. putchar(' '); } } return 0; } ``` 请注意此示例仅适用于正整数,并且为了简单起见忽略了错误检查和其他复杂情况。实际应用时应该添加必要的边界条件检测以及更完善的功能支持。 此外,在某些嵌入式系统中可以直接通过硬件指令或者特定库来进行这种类型转换
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

书灯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值