苦思不得其果!求高手速速来救!十进制转BCD!
我打算做一个十六进制到BCD码的转换,
一个字节的转换倒是没问题,
可是问题是,这个BCD码分为了3个字节!
比如说我保存了778899这个数字,用3个字节的BCD码保存也就是0x77,0x88,0x99,
问题来了,把这3字节的BCD码转换为了十进制的方法倒是简单,我把这3字节保存在数组里,然后用下面这个函数:
大概可以这么写
- C/C++ code
unsigned long BcdtoHex(UCHAR *bcd){unsigned long BcdtoHex(UCHAR *bcd){ unsigned long hex=0,temp; temp=(*bcd)/16; hex+=(temp*100000+(*bcd)%16*10000); printf("%ld\n",hex); temp=(bcd[1])/16; hex+=(temp*1000+(bcd[1])%16*100); printf("%ld\n",hex); temp=(bcd[2])/16; hex+=(temp*10+(bcd[2])%16); printf("%ld\n",hex); return(hex);}
而十进制转成BCD码的函数该怎么写?我用上面这个函数转换得到的十进制数后,做完数值处理,再转换成3个字节的BCD码,
比如得到十进制778899,转换成BCD码0x77,0x88,0x99?????
想一上午了不知道怎么搞!小弟新手,望各位大侠帮帮忙!实在是想不出啥办法来了!
[解决办法]
BCD码不是 4位还是一个字节表示一个十进制的吗??
[解决办法]
4位表示一个十进制数的
十进制转bcd.
unsigned int n=45678;
unsigned char buf[16];
sprintf(buf,"%u",n);
int len=strlen(buf);
unsigned char bcd[16]={0};
for(int i=len-1;i!=0;--i)
{
bcd[i/2]|=(buf[i]-'0')<<(!(i&1)*4);
}
bcd[(len-1)/2+1]='\0';
...
好乱
[解决办法]
压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8.
[解决办法]
不过看你1L的意思,大概最多 8位数,4个字节够了?
如果是固定的,那么就好做多了.
否则,还是很烦人的.
[解决办法]
十进制778899,先转换成77;88;99三个数
然后
a=7+7*16
b=8+8*16
c=9+9*16
[解决办法]
如果可以用库函数的话,可以用下面的方法:
#include <stdlib.h>
unsigned int dec_to_bcd(unsigned int dec_val)
{
char buf[16] = {0};
_itoa(dec_val, buf, 10);
return strtol(buf, 0, 16);
}//end of dec_to_bcd()
[解决办法]
void itob(int nu)
{
while(nu)
{
printf("%c",'0'+nu&(1UL<<31); //32位机
nu=nu<<1;
}
putchar('\n');
}
以上为用以为做
[解决办法]
移 位