BCD码(Binary-Coded Decimal‎),用4位 二进制数 来表示1位 十进制数 中的0~9这10个数码,是一种二进制的数字编码形式,用 二进制编码的十进制 代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使 二进制 十进制 之间的转换得以快捷的进行。这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的 浮点 记数法 ,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD编码亦很常用。

代码实现:

#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uint8;
typedef unsigned int  uint32;
typedef unsigned short WORD;
typedef struct _SYSTEMTIME {
    WORD wYear;
    WORD wMonth;
    WORD wDayOfWeek;
    WORD wDay;
    WORD wHour;
    WORD wMinute;
    WORD wSecond;
    WORD wMilliseconds;
} SYSTEMTIME;
uint8 HEX2BCD(unsinged char hex_data)
	uint8 bcd_data;
	uint8 temp;
	if (hex_data <= 99)
		temp = hex_data % 10;
		bcd_data = hex_data / 10 << 4;
		bcd_data = bcd_data | temp;
		bcd_data = 0xFF;
	return bcd_data;
int main() {
    SYSTEMTIME gCurrTime;
    gCurrTime.wYear = 2024;
    gCurrTime.wMonth = 12;
    gCurrTime.wDay = 4;
    gCurrTime.wHour = 9;
    gCurrTime.wMinute = 30;
    gCurrTime.wSecond = 59;
     printf("BCD: %x %x %x %x %x %x",HEX2BCD((gCurrTime.wYear)/100 ),HEX2BCD((gCurrTime.wYear)%100),HEX2BCD(gCurrTime.wMonth),HEX2BCD(gCurrTime.wDay) ,HEX2BCD(gCurrTime.wHour) ,HEX2BCD(gCurrTime.wMinute)  );
    return 0;

实测效果:

BCD码也叫二进制编码的十进制数,就是为了方便二进制与十进制的换而定义的。(如无特殊说明,BCD码指8421BCD码) 1、BCD码每四位表示十进制中的一位的二进制表示;BCD码换为十进制同理,从右往左每四位按二进制换为十进制2、因为4位二进制有0到15共16个数,而十进制中只有0到9共10个数,所以BCD码中每四位有6个无效码,即1010到1111。 在进行BCD码加法运算时,如果运算结果处于无效码区间,则需要将运算结果+6(0110)。多位数加法同理,注意,如果出现无效码的地方不是在最后一位,就不 一、BCD码简介 BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,常应用于计算机内部十进制与二进制之间的换。 BCD码可分为有权码和无权码两类。其中,常见的有权BCD码有8421码、2421码、5421码;无权BCD码有余3码、余3循环码、格雷码。8421码,顾名思义,自高... 在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。「8421码」是最基本也是最常用的的一种BCD编码,由4位二进制组成,各位的权值分别是8、4、2、1,8421码的名字也是由此而来。「BCD码」使用 4 位二进制来表示 1 位十进制,即使用 4 个位来存储一个十进制的值,使二进制和十进制之间的换以快捷的进行。 unsigned int hexresult; //待化的16进制数; unsigned char bcdresult[5]; //化后的bcd码存入数组; void hex2bcd() bcdresult[0]=hexresult%10;//个位 bcdresult[0]=(hexresult/10)%10;//十位 bcdresult[0]=(hexresult/10 首先问大家一个问题:计算机是如何把二进制换成十进制的? 我们平时生活中常用的是十进制,即0 1 2 3 4 5 6 7 8 9,我们使用电脑运算时,会输入十进制的数字,电脑则返回十进制的运算结果。 可实际上,电脑并不能运算十进制,那电脑是怎么运算的呢? 答案是换为二进制。 当电脑收到我们输入的「十进制」之后,会先把十进制「换」为二进制,对「二进制」进行运算,再将运算的结果换为十进制,返回给我们。 BCD码的英文全称是Binary-Coded Decimal‎,简称BCD,按字面解释是二进制二进制十进制代码,是一种二进制的数字编码形式。通常用4位二进制代码对十进制数字符号进行编码,在这里会主要介绍的几种常用BCD码就是8421码,2421码和余3码。疑问:BCD码是用二进制数对十进制数编码,明明可以直接把十进制数化为二进制数,为什么非要搞一个四位对一位的BCD码BCD码(Binary-Coded Decimal‎)称为二进码,用4位二进制数来表示1位十进制数中的0~9这10个数码。是十进代码中最常用的一种。在这种编码方式中,每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的 二进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。其中每一位 “1”代表的十进制数称为这一位的权。因为每位的权都是固定不变的,所以8421码是恒权码。 在实际应用中需要换超过255的十六进制数换为BCD码,如0x123456,但是我找了半天没找到解决问题的方式,找到了也有很多问题,所以自己在理解这些代码后自己写一个。 先来一个我之前找到的一个版本,这个版本的问题在于,超过99后,换的BCD码就乱了,出现0->99->0->99->0->55->100->199->100->199->100->155->200…以此类推的这样的循环。后面看代码发现这个限制,0... 8421BCD码人性化的存在计算机内毫无例外地都使用二进制数进行运算,但通常采用8进制和十六进制的形式读写。对于计算机技术专业人员,要理解这些数的含义是没问题,但对非专业人员却不那么容易的。由于日常生活中,人们最熟悉的数制是十进制,因此专门规定了一种二进制的十进制码,称为BCD码(Binarycoded Decimal),它是一种以二进制表示的十进制数码。 8421BCD为最常用的一种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... /************************************************************************************************************************* *函数         : void HextoBCD(u8 *pBuff,u8 len) *功能         : 十六进制BCD码 大家都知道在计算机中,数据的常用编码格式有二进制、八进制、十进制和十六进制等,这些编码格式之间可以相互换。在电力通信协议中,很多数据都是用BCD格式来编码的,这些数据需要换为普通的十进制数字串。本文首先对BCD码进行简单的介绍,然后用代码演示它与十进制数字字符串之间的换。 运用介绍:8421BCD码中的“8421”表示从高到低各位二进制位对应的权值分别为8、4、2、1,将各二进制位与权值相乘,并将乘积相加就得相应的十进制数。例如,8421BCD码“0111”,0×8+1×4+1×2+1×1=7D,其中D表示十进制。bcd_8421模块代码(该代码参考了野火的8421bcd编码)