回 帖 发 新 帖 刷新版面

主题:[原创]小于36的任意进制间的相互转换简单实现

这个函数是非常不严谨的 把a进制转换成b进制函数。原型中的a,b分别表示a,b进制,sa是要转换的a进制字符,sb表示的是(如果转换成功)得到的b进制数。



[code=c]int ( a_to_b )( char *sb,const char *sa, unsigned short a,unsigned short b ) {
    const unsigned char table1[ 128 ] = {
               36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,
               36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,
               36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,
                0, 1, 2, 3, 4, 5, 6, 7, 8, 9,36,36,36,36,36,36,
               36,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
               25,26,27,28,29,30,31,32,33,34,35,36,36,36,36,36,
               36,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,
               25,26,27,28,29,30,31,32,33,34,35,36,36,36,36,36 
               };
    const char table2[   ] = 
               "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ; 
    unsigned long total = 0 ;
    unsigned char ch    = 0 ;
    char noname_p[31]={0},*p = noname_p ;      
    
    if  ( !sb || !sa || 2>a || 2>b || 36<a || 36<b ) return 0 ;
    for ( --sa;*++sa ==' '; )    ;//跳过空格 
    if  ( *sa=='+' || *sa=='-' ) 
          *p  = *sa++ ;//符号 
    if  ( (sa[ 0 ] == '0') && (sa[1]=='x' || sa[1]=='X') ) 
    {   //0x或0X 前导的是16进制格式 
        a   = 16 ;
        sa += 2  ;
    }
   for ( --sa;*++sa =='0'; )     ;//跳过0 

   for ( total=0,--sa; (ch=table1[*++sa])<a; total = total*a + ch )
            ;//把a进制字符转换成数 

   if  ( *sa ) 
   {   //sa中有字符不是a进制字符 
       *sb = '\0' ;
       return 0   ;
   }
   if ( *p ) 
   {    //复制符号 
        *sb++ = *p;
        *p    =0  ;
   }

   do {  //把total转换成b进制字符(反序) 
      *++p = table2[ total%b ] ;
   } while( (total /= b)>0 );

   *++p = 0 ;--sb;
   while( *++sb = *--p )   ;//把b进制字符复制到sb中 
   return  1 ;//转换成功 
}[/code]  

回复列表 (共6个回复)

沙发

 

板凳

char *p = ( char[31] ){} ; 
个人认为这句话并不比char *p=(char*)malloc(31*sizeof(char));拥有更好的可移植性和可重用性

3 楼

更不如 char p[31] 了

4 楼

如果用char p[31]不是多需要一个变量来访问它么?

5 楼

其实如果转换量不大,倒是有一个并不高效但却很简单的方法:
1、自己实现任意进制到10进制的转换函数。
2、系统中存在10进制到任意进制的函数itoa:)

6 楼


http://www.electric-scissors.com/
http://www.notch07.com/
http://www.labtoplus.com/
http://www.americombn.com/
http://www.machiya-studio.net/ 
http://www.toproofinginc.com/
http://www.speed-freight.net/
http://www.hirocksound.net/

http://www.linalg.net/ 
http://www.ccnettv.net/

http://www.jdzez.com/ 
http://www.gulingt.com/


http://www.ustdrama.com/ 
http://www.visitsingapore-zhenghe.com/ 

----------------------------------------------------------

http://www.288088.com/ 
http://www.57152.com/
http://www.98836.com/
http://www.055088.com/
http://www.033088.com/ 
http://www.022088.info/
----------------------------------------- 
http://www.070168.com/ 
http://www.368988.com/
http://www.788618.com/
http://www.99718.com/
http://www.086668.com/

http://www.999568.com/
http://www.728666.com/
http://www.688968.com/
http://www.008228.com/
http://www.755799.com/


http://www.889908.com/
http://www.560088.com/
http://www.855766.com/ 
http://www.aysny.cn/
http://www.lhc45.com.cn/
http://www.99248.com/
http://www.70922.com/
&nbsp;http://www.50922.com/

我来回复

您尚未登录,请登录后再回复。点此登录或注册