原理可以参考http://www.cnblogs.com/phinecos/archive/2009/09/11/1564975.html 《浅谈大数的进制转换》 //ConvSystem.c #include <stdio.h> #include <stdlib.h> #include <string.h> typedef unsigned char byte, *pbyte ; typedef unsigned int uint ; char *strTab = "0123456789ABCDEF" ; typedef struct tagCONVDATA { pbyte pBuf ; //被转换的数据缓冲区 int iBufLen ; //数据字节数 int iFrom ; //从iFrom进制转到iTo进制,范围为(2-16) int iTo ; }CONVDATA, *LPCONVDATA ; //进制转换,ConvSystem改成一个参数,这样在递归时可以少压几个参数 void ConvSystem(LPCONVDATA data) { int i, s = 0, y = 0 ; //s商 y余数 if(data->iBufLen <= 0) return ; for(i=0; i<data->iBufLen; i++) { y = y * data->iFrom + data->pBuf[i] ; //上位计算得到的余数*转换前进制+本位数 s = y / data->iTo ; //求得商 y = y % data->iTo ; //求得余数 data->pBuf[i] = s ; //保存商,以便下轮递归时使用 } //这样一轮下来,余数y就是所求的结果的某一位,如第一轮时,得到的y为iTo进制的最低位数据 for(i=0; i<data->iBufLen && data->pBuf[i]==0; i++) ; //下轮使用的数据要把前导0剔除 data->pBuf += i ; data->iBufLen -= i ; ConvSystem(data) ; //递归 printf("%c", strTab[y]) ; //输出此位 } int main(int argc, char *argv[]) { byte buf[1024] ; int i, j ; CONVDATA data ; if(argc < 6) { printf("Usage: ConvSystem.exe -f from_a_system -t to_a_system data/n") ; printf("Ex: ConvSystem.exe -f 16 -t 10 1234567890ABCDEF/n") ; return 0 ; } data.pBuf = buf ; data.iBufLen = 0 ; for(i=1; i<argc; ) { if(argv[i][0] == '-' || argv[i][0] == '/') { switch(argv[i][1]) { case 'f': case 'F': if(i+1 > argc) { printf("参数格式错误!/n") ; return 0 ; } data.iFrom = atoi(argv[i+1]) ; i += 2 ; break ; case 't': case 'T': if(i+1 > argc) { printf("参数格式错误!/n") ; return 0 ; } data.iTo = atoi(argv[i+1]) ; i += 2 ; break ; } } else { strcpy(data.pBuf, argv[i]) ; data.iBufLen = strlen(data.pBuf) ; i++ ; } } if(data.iFrom>16 || data.iFrom<2 || data.iTo>16 || data.iTo<2) { printf("进制转换的范围为2-16进制之间!/n") ; return 0 ; } //直接转换数据(不进行验证数据是否正确) for(i=0, j=0; i<data.iBufLen; i++) { if(buf[i]>='0' && buf[i]<='9') buf[j++] = buf[i]-'0' ; else if(buf[i]>='A' && buf[i]<='F') buf[j++] = buf[i]-'A'+10 ; else if(buf[i]>='a' && buf[i]<='f') buf[j++] = buf[i]-'a'+10 ; } ConvSystem(&data) ; return 0 ; }