📄 bcd.c
字号:
/*
说明:
如果前面无特殊说明,这里的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 + -