BCD和ASCII相互转化及BCD转int的函数,重新写的,感觉还不错。
可以根据自己的需要更改返回值。
/**********************stdfunc.h***********************/
#ifndef _STD_FUNC_H_
#define _STD_FUNC_H_
/*
参数
bcd: 转化后BCD结果
asc: 需转化ASC字符串
len: 需转化长度
fmt: 转化后的格式,即长度为奇数时,前补还是后补零
返回值
处理的BCD字节长度
*/
int ASC2BCD(unsigned char *bcd, const char *asc, int len, int fmt);
/*
参数
asc: 转化后ASC结果
bcd: 需转化BCD字符串
len: 需转化长度
fmt: 需转化BCD的格式,即长度为奇数时,前补还是后补零
返回值
处理的BCD字节长度
*/
int BCD2ASC(char *asc, const unsigned char *bcd, int len, int fmt);
/*
参数
plen: 转化后int结果指针
bcd: 需转化BCD字符串
len: 需转化长度
fmt: 需转化BCD的格式,即长度为奇数时,前补还是后补零
返回值
处理的BCD字节长度
*/
int BCD2INT(int *plen, const unsigned char *bcd, int len, int fmt);
#endif /* _STD_FUNC_H_ */
/**********************stdfunc.c***********************/
#include "stdfunc.h"
int ASC2BCD (unsigned char *bcd, const char *asc, int len, int fmt)
{
int i, odd;
char c;
odd = len&0x01;
if ( odd && !fmt)
*bcd++ = (*asc++) & '/x0F';
len >>= 1;
for (i=0; i<len; i++) {
c = (*asc++) << 4;
c |= (*asc++) & '/x0F';
*bcd++ = c;
}
if ( odd && fmt)
*bcd = (*asc) << 4;
return (i+odd);
}
int BCD2ASC (char *asc, const unsigned char *bcd, int len, int fmt)
{
int i, odd;
unsigned char c;
odd = len&0x01;
if ( odd && !fmt)
*asc++ = ((*bcd++)&'/x0F') + '0';
len >>= 1;
for (i=0; i<len; i++) {
c = *bcd++;
*asc++ = (c>>4) + '0';
*asc++ = (c&'/x0F') + '0';
}
if ( odd && fmt)
*asc = ((*bcd)>>4) + '0';
return (i+odd);
}
int BCD2INT(int *plen, const unsigned char *bcd, int len, int fmt)
{
int l=0, i, odd;
unsigned char c;
odd = len&0x01;
if ( odd && !fmt)
l = (*bcd++)&'/x0F';
len >>= 1;
for (i=0; i<len; i++) {
c = *bcd++;
l *= 10;
l += c>>4;
l *= 10;
l += c&'/x0F';
}
if ( odd && fmt)
{
l *= 10;
l += (*bcd)>>4;
}
*plen = l;
return (i+odd);
}