关于BCD码的若干问题

hxhx 2005-07-27 05:34:45
最近遇到了BCD码转换上的若干问题,
请问哪位大侠是否有 ASCii码与BCD码之间转换的源码,可否发一份。。
邮箱:FanHJ@clshops.com
先谢了。。。
...全文
300 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
antijpn 2005-07-28
  • 打赏
  • 举报
回复
直接求代码,转新手乐园
hxhx 2005-07-28
  • 打赏
  • 举报
回复
有否调试过,等我一调试成功,,马上接分。。
说话算话,,这里100 外加100
windcandle 2005-07-28
  • 打赏
  • 举报
回复
/*------------------------------------------------------------------------*/
/* Function Name: bta */
/* Description: 把整型数转化为'0'-->'F'的字符 */
/* Input: 整数 */
/* Output: 字符 */
/* Return: 转化后的字符 */
/*------------------------------------------------------------------------*/
static char
bta( int _asc )
{
if (_asc > 9) return((_asc-10) + 'A') ;
else return(_asc+'0') ;
}

/*------------------------------------------------------------------------*/
/* Function Name: bcdTOasc */
/* Description: 把BCD码转化成ASC码 */
/* Input: BCD码字符串 */
/* Output: ASC码字符串 */
/* Return: 转化后的ASC码字符 */
/*------------------------------------------------------------------------*/
char *
bcdTOasc( unsigned char *_bcd )
{
static char asc[17] ;
int i ;
for( i = 0; i < 8; i++ ) {
asc[i*2] = bta((_bcd[i] >> 4) & 0x0f) ;
asc[i*2+1] = bta(_bcd[i] & 0x0f) ;
}
asc[16] = 0 ;
return asc ;
}

/*------------------------------------------------------------------------*/
/* Function Name: atb */
/* Description: 把'0'-->'9','a'-->'f','A'-->'F'的字符转化为整型数 */
/* Input: 字符 */
/* Output: 整数 */
/* Return: 转化后的整型数 */
/*------------------------------------------------------------------------*/
static int
atb( char _asc )
{
if (_asc >= 'A' && _asc <= 'F') return(_asc - 'A'+ 10) ;
else if (_asc >= 'a' && _asc <= 'f') return(_asc - 'a'+ 10) ;
else return _asc - '0' ;
}

/*------------------------------------------------------------------------*/
/* Function Name: ascTObcd */
/* Description: 把ASC码转化成BCD码 */
/* Input: ASC码字符串 */
/* Output: BCD码字符串 */
/* Return: 转化后的BCD码字符 */
/*------------------------------------------------------------------------*/
unsigned char *
ascTObcd( char *_asc )
{
static unsigned char bcd[9] ;
int i ;

for( i = 0; i < 8; i++ )
bcd[i] = (atb(_asc[i*2]))*0x10 + atb(_asc[i*2+1]) ;

bcd[8] = 0 ;
return bcd ;
}
hxhx 2005-07-28
  • 打赏
  • 举报
回复
TO afx_swallow(足球和啤酒)
可否帮忙写一个。我将再补100分
hxhx 2005-07-28
  • 打赏
  • 举报
回复
完整结构呀,不然怎么看哦。谢了。
jixingzhong 2005-07-28
  • 打赏
  • 举报
回复
不过只是针对数字的

bcd 《bcd.h 》中

数学子程序 把一个数转换为相对应的BCD码
afx_swallow 2005-07-28
  • 打赏
  • 举报
回复
编一个也不费时
hxhx 2005-07-28
  • 打赏
  • 举报
回复
说来听听,,不过目的不是要输出,而且存储。
jixingzhong 2005-07-28
  • 打赏
  • 举报
回复
有个函数可以输出BCD玛...


hxhx 2005-07-28
  • 打赏
  • 举报
回复
TO windking21(暗淡)
可否对此段代码作个说明。。
hxhx 2005-07-28
  • 打赏
  • 举报
回复
嗯。。这个我有了,而且是在LIUNIX平台下的,我现在是在UNIX下,只要做些许定义变化。。

但是我还是不太明白,如果是多字节的话需要做何更改呢。。。
PMsg 2005-07-28
  • 打赏
  • 举报
回复
uint BCDtoASC(uchar bcd_data)
{
uint hex_data;
uchar x;
// x=bcd_data&0x0f;
x=bcd_data%0x10;
hex_data=((bcd_data/0x10+0x30)<<8)+(x+0x30);
return(hex_data);
}
uint ASCtoBCD(uchar hex_data)
{
uchar bcd_data;
bcd_data=(hex_data-0x30)&0x0f;

return (bcd_data);
}

void main()
{
uchar c;
uint a;
// c=0x99;
a=BCDtoASC(0x99);
c=ASCtoBCD(0x39);
}

别人写的一个字节的
hxhx 2005-07-28
  • 打赏
  • 举报
回复
算法很简单,但是如果C语言不熟悉的话那么也是个大问题,所以还是希望哪位大侠能给份源程序。

邮箱:FanHJ@clshops.com
sinkerwu 2005-07-28
  • 打赏
  • 举报
回复
while ( *phexchar !='\0' )
{
tempnum1 =hexchar[index]-'0';
tempnum2 =hexchar[index+1]-'0';

bcddata =(tempnum1<<4) | tempnum2;
pbuff[i]=bcddata;

phexchar++;
phexchar++;
i++;
index=index+2;
}
return(i) ;
windcandle 2005-07-28
  • 打赏
  • 举报
回复
上面的代码有个未知函数,需稍作改动。如下:

int
bcd2asc(char * old_str, int old_len, char * new_str)
{
int i;
char c, c1, c2;
char *p;
char a_hnum[]="0123456789ABCDEF";

p = new_str;
for ( i = 0; i < old_len; i ++ ) {
c = old_str[i];
c1 = (c >> 4) & 0x0F;
c2 = (c & 0x0F );
*p = a_hnum[c1];
p ++;
*p = a_hnum[c2];
p ++;
}
return old_len * 2 ;
}

int
asc2bcd(char * old_str, int old_len, char * new_str)
{
int len;
int i;
char c1;
char c2;
char c;
char *p;
char str[256];
char a_hnum[]="0123456789ABCDEF";

p = new_str;
memset ( str, 0, sizeof ( str ) );

len = old_len;
if ( old_len % 2 != 0){
strcpy ( str, "0" );
len ++;
}

memcpy ( str + strlen ( str ), old_str, old_len );
for ( i = 0; i < len; i ++ ) {
if ( str[i] >= '0' && str[i] <= '9' )
str[i] -= '0';
else if ( str[i] >= 'A' && str[i] <= 'F' ) {
str[i] -= 'A' ;
str[i] += 10;
} else if ( str[i] >= 'a' && str[i] <= 'f' ) {
str[i] -= 'a' ;
str[i] += 10;
}
else{
return -1;
}
}

for ( i = 0; i < len; i ++,i++ ) {
c1 = str[i];
c2 = str[i+1];
c = (c1 << 4) | (c2 & 0x0F );
*p = c;
p ++;
}
return len/2 ;
}
windcandle 2005-07-28
  • 打赏
  • 举报
回复
下面这个是肯定可以的。

int
bcd2asc(char * old_str, int old_len, char * new_str)
{
int i;
char c, c1, c2;
char *p;
char a_hnum[]="0123456789ABCDEF";

p = new_str;
for ( i = 0; i < old_len; i ++ ) {
c = old_str[i];
c1 = (c >> 4) & 0x0F;
c2 = (c & 0x0F );
*p = a_hnum[c1];
p ++;
*p = a_hnum[c2];
p ++;
}
return old_len * 2 ;
}

int
asc2bcd(char * old_str, int old_len, char * new_str)
{
int len;
int i;
char c1;
char c2;
char c;
char *p;
char str[256];
char a_hnum[]="0123456789ABCDEF";

p = new_str;
memset ( str, 0, sizeof ( str ) );
bcl_str_toupper ( old_str );

len = old_len;
if ( old_len % 2 != 0){
strcpy ( str, "0" );
len ++;
}

memcpy ( str + strlen ( str ), old_str, old_len );
for ( i = 0; i < len; i ++ ) {
if ( str[i] >= '0' && str[i] <= '9' )
str[i] -= '0';
else if ( str[i] >= 'A' && str[i] <= 'F' ) {
str[i] -= 'A' ;
str[i] += 10;
}
else{
return -1;
}
}

for ( i = 0; i < len; i ++,i++ ) {
c1 = str[i];
c2 = str[i+1];
c = (c1 << 4) | (c2 & 0x0F );
*p = c;
p ++;
}
return len/2 ;
}
hxhx 2005-07-28
  • 打赏
  • 举报
回复
呵呵。。谢谢。。。
windcandle 2005-07-28
  • 打赏
  • 举报
回复
嗯,好像是。我再给你找一个。
hxhx 2005-07-28
  • 打赏
  • 举报
回复
TO windcandle()
好像这段代码有点问题呀,是不是只能转ABCD这样的字符啊。。数字字符就不能转了吗??
sinopsw 2005-07-27
  • 打赏
  • 举报
回复
如果是8421BCD码的话转换很简单的啊,为什么要到这里来求程序呢?
加载更多回复(3)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧