⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bcd.c

📁 个人曾经在工作上的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* 
	说明: 
	如果前面无特殊说明,这里的bcd.c中的所有的运算都是指标准的压缩BCD码\
	(低位在前,高位在后)的运算.

	写函数过程中的一些使用默认的术语(这里所说的非常的标准).
		Bin:		1字节标准二进制数. 
		Hex:		1字节标准十六进制数
			// 注: 这两个东西在值上面无区别, 只是在转换成ASCII码时有点差别. 举例如下: 
			若 src = 0xAB; 
			则调用 HextoAsc 后的值为: 'A', 'B'$
			但调用 BintoAsc 后的值为: '1', '0', '1', '0', '1', '0', '1', '1'$
		Dec:		1字节数, 用于十进制数的表示, 这个字节的取值范围为: 0~99(0x00~0x63)
		Asc:		ASCII格式的数据. 

		LWord:	无符号长整型. 
		LHex:		无符号十六进制长整型. 
			// 注 LWord 与 LHex 的唯一区别也只有在转换成ASCII时有点差别, 其余相同. 

	注:	1. 由于为了兼容以前的程序, 所以这里做了一些修改, 想到了一种怎么样把以前的转换函数进行保留的方法. 
			2. 单字节 BCD 码不存在与二进制和十六进制的转换问题, 只存在与 Dec 的转换问题. 
			3. 这里还有部分函数没有完成, 其中可以查找以省略号开头的函数就行了. 
			4. 若所传参数非法, 则返回值亦非法. 
			5. BCD的格式中也有正数与负数之分, 这里采用的BCD格式扩展补码形式. 这样 Inc, Dec, Add, Sub, Neg
				就不存在符号判断的问题;	以前在 PE1 中的BCD码的格式是采用了另外一种格式(以BCD码的最高位表示符号位, 
				0表示正, 1表示负), 不过只有正数的操作, 所以目前的程序可以完全的兼容以前的格式.  
*/

#include "ecrsys.h"
//#include "ftype.h"
#include "stdlib.h"


/**************************  Start  ***************************/
/*-------------------------------------------------------------------------------------------
*  Decimal data to the compressed BCD data
*  2004-12-13 16:50
*------------------------------------------------------------------------------------------*/
CHR DectoBCD(CHR num)
{
	CHR bcd;

	bcd = ((num/10%10)<<4) + num%10;		/* If num larger than 99, remain the low 2 digits */
	return (bcd);
}

/*-------------------------------------------------------------------------------------------
*  Compressed BCD data to the decimal data
*  2004-12-13 16:55
*------------------------------------------------------------------------------------------*/
CHR   BCDtoDec(CHR Num)
{
   return( ( Num >> 4 ) * 10 + (Num & 0x0f));
}

/*--------------------------------------------------------------------------------------------
*  Decimal data change to ASCII data return to *ptr.
*  Note: Only consider one bytes situation
*  03-4-3 11:12
*-------------------------------------------------------------------------------------------*/
void DectoAsc(CHR *ascstr,CHR num)
{
   *ascstr++=(num%100)/10+0x30;
   *ascstr=num%10+0x30;    
}

byte	AsctoDec(byte i, ...)
{
	
}

/*-------------------------------------------------------------------------------------------
*  Hex data to ASCII data, return to *ptr.
*  Note:    Only consider on bytes situation too.
*  03-4-3 11:14
*-------------------------------------------------------------------------------------------*/
void HextoAsc(CHR *ascstr,CHR num)
{  
   CHR   ch;
   ch=(num>>4)&0x0f;
   *ascstr=ch+0x30;
   if(ch>9)
      *ascstr+=7;
   ascstr++;
   ch=num&0x0f;
   *ascstr=ch+0x30;
   if(ch>9)
      *ascstr+=7;
}

byte	AsctoHex(byte i, ...)
{
}

/*-------------------------------------------------------------------------------------------
*  Compress Data change to BCD data
*  2004-12-14 10:57
*	eg.	bcdstr = {0x01,0x23,0x45,0x67}, len = 3
*		ascstr = {'4','5','2','3','0','1'}
*------------------------------------------------------------------------------------------*/
void  BCDtoAsc( CHR *ascstr,CHR  *bcdstr,CHR len )
{
   CHR tmp;
   while(len --)
   {
   	tmp = bcdstr[len];
   	*ascstr++ = (tmp>>4) + '0';
   	*ascstr++ = (tmp&0x0F) + '0';
   }
}

void	AsctoBCD(byte i, ...)
{
}

/*-------------------------------------------------------------------------------------------
*  Unsigned long Data change to BCD data
*  2004-12-13 17:28
*------------------------------------------------------------------------------------------*/
void LWordtoBCD( CHR *bcdstr, DWORD num, CHR len )
{
   byte tmp;
   byte i = 0;

   while( num && len)
   {
      tmp=num%100;
      num=num/100;
      bcdstr[i ++]= DectoBCD(tmp);
      len--;
   }
   while(len --)
      bcdstr[i ++]=0x00;
}

/*---------------------------------------------------------------------------------------------
*  Change the Bcd string to Long.
*  Input :  *bcdstr --- bcd string pointer
*        :  
*  Output   :
*        :  Long value of the converted data.
*  Note  : Of course, only 4 bytes for maximum.
*  2004-12-13 17:34
*--------------------------------------------------------------------------------------------*/
DWORD BCDtoLWord( CHR *bcdstr,CHR len )
{
   DWORD tmp = 0;
   CHR num = 0;

   bcdstr += len;
   while(len)
   {
   	num = *(-- bcdstr);
   	tmp *= 100;
   	tmp += (num & 0x0f) + ((num & 0xf0) >> 4 ) * 10;
   	len --;
   }
   return(tmp);
}

/*---------------------------------------------------------------
*  Change the long word number to ASCII data 
*	2004-12-14 11:01
*---------------------------------------------------------------*/
void LWordtoAsc( CHR *asc_str, DWORD num, CHR len)
{
	while(len --)
	{
		asc_str[len] = num%10 + '0';
		num /= 10;
	}
}

void	AsctoLWord(byte i, ...)
{
}

/*================================================================================
*  Change the Hex data to ASCII string.
*	2004-12-14 11:18
*===============================================================================*/
void  LHextoAsc(CHR *ascstr,DWORD hexnum,CHR len )
{
	CHR	tmp;
	while(len --)
	{
		tmp = ((byte)hexnum) & 0x0F;
		tmp += '0';
		if(tmp > '9')
			tmp += 7;
		ascstr[len] = tmp;
		hexnum >>= 4;
	}
}

void	AsctoLHex(byte i, ...)
{
}

// Increment the BCD string data
// 2004-12-13 17:44
void	BCD_Inc(CHR *bcdstr, CHR len)
{
  	CHR tmpnum;
  	CHR i;

	for(i = 0; i < len; i ++)
	{
		tmpnum = bcdstr[i];
    	if((tmpnum&0x0f)!=9)
    	{
    	  bcdstr[i]+=1;
    	  break;
    	}
    	if( (tmpnum&0xf0)!=0x90 )
    	{
    	  bcdstr[i]=(tmpnum&0xf0)+0x10;
    	  break;
    	}
    	bcdstr[i] = 0x00;
	}
}

// Decrement the BCD string data.
// 2004-12-13 18:09
void BCD_Dec(CHR *bcdstr, CHR len)
{
	CHR i;
	CHR tmpnum;

	for(i = 0; i < len; i ++)
	{
		tmpnum = bcdstr[i];
		if((tmpnum&0x0F) != 0x00)
		{
			bcdstr[i] -= 0x01;
			break;
		}
		if((tmpnum&0xF0) != 0x00)
		{
			bcdstr[i] = (tmpnum&0xF0)-0x10;
			bcdstr[i] |= 0x09;
			break;
		}
		bcdstr[i] = 0x99;
	}
}

/******************************************************************************
* Describe:	compare two compressed BCD data. (Unsigned compare)
* Input :	src1, src2, len
* Output:	void
* return:	0--> src1 == src2
*           1--> src1 >  src2
*          -1--> src1 <  src2
* 2004-12-14 8:49
******************************************************************************/
int BCD_Cmp(const CHR *src1, const CHR *src2, CHR len)
{
	while(len --)
	{
		if(src1[len] == src2[len])
		{
			continue;
		}
		else if(src1[len] > src2[len])
		{
			return (1);
		}
		else // src1[len] < src2[len]
		{
			return (-1);
		}
	}
	return (0);
}

/******************************************************************************
* Describe:	compare two compressed BCD data. (Signed compare)
* Input :	src1, src2, len
* Output:	void
* return:	0--> src1 == src2
*           1--> src1 >  src2
*          -1--> src1 <  src2
* 2004-12-14 9:12
******************************************************************************/
int BCD_ICmp(const CHR *src1, const CHR *src2, CHR len)
{
	if(len == 0)
		return (0);
	len --;
	if((src1[len] < 0x50) && (src2[len] >= 0x50))
	{
		return (1);
	}
	else if((src1[len] >= 0x50) && (src2[len] < 0x50))
	{
		return (-1);
	}
	else
	{
		if(src1[len] > src2[len])
			return (1);
		else if(src1[len] < src2[len])
			return (-1);
	}

	while(len --)
	{
		if(src1[len] == src2[len])
		{
			continue;
		}
		else if(src1[len] > src2[len])
		{
			return (1);
		}
		else // src1[len] < src2[len]

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -