整个代码互转只有3个函数
-
ToHexNum
-
ToDecNum
-
ToBiNum
因为我代码中二进制和十六进制可以通过十进制间接转换,所以实际上只要写 -
十进制 <->二进制
-
十进制<->十六进制进制
而十进制<->十六进制,是由上面两个转换组合而来,即二进制<->十进制<->十六进制
//如果你愿意的话,也可以用十进制<->二进制<->十六进制的顺序来编写
先贴一下截图
输入的时候,除了二进制外后缀都需要加上对应格式缩写
十进制输入格式: xxxxd或者xxxxD
十六进制格式: xxxxh或者xxxxH
二进制格式: xxxxx (没有后缀)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
//the type of number
#define HEX 1
#define DEC 2
#define BIN 3
#define DEBUG 0
typedef struct{
void *base;
void *top;
int len;
}stack;
int num_dec=0;
int ToHexNum(char *num,const int type,const int len)
{
if(type==2)//DEC to hex
{
stack *s=(stack *)malloc(sizeof(stack)); s->len=0;
char *base_p=(char *)s->base;
char *top_p=(char *)s->top;
base_p=(char *)malloc(len*sizeof(char));
top_p=base_p;
if(num_dec==0)
{
int i=0;
int power=1;
while(i<len)//char number to int number;
{
num_dec+=power*(num[len-i-1]-48);
power*=10;
i++;
}
}
while(num_dec!=0)
{
switch(num_dec%16)
{
case 10:*top_p++='A';break;
case 11:*top_p++='B';break;
case 12:*top_p++='C';break;
case 13:*top_p++='D';break;
case 14:*top_p++='E';break;
case 15:*top_p++='F';break;
default:*top_p++=num_dec%16+'0';break;
}
num_dec/=16;
s->len++;
}
printf("\tHex:[");
--top_p;
while(s->len>0)
{
printf("%c",*top_p--);
s->len--;
}
printf("]\n");
free(base_p);
free(s);
}
if(type==3)//Bin to hex
{
num_dec=ToDecNum(num,type,len);
ToHexNum(num,DEC,len);
}
return 1;
}
int ToDecNum(char *num,const int type,const int len)//done
{
int power=len;
int result=0;
#if DEBUG
puts("\nTesting contents:");
puts(num);
printf("type=%d,len=%d",type,len);
#endif
if(type==1)//hex
{
power-=2;
while(power>=0)
{
if(num[len-power-2]<=57)
{
#if DEBUG
printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-2],num[len-power-2]-48,pow(16,power),power);
#endif
result+=(num[len-power-2]-48)*pow(16,power);
}
else if(num[len-power-2]<=90)
{
#if DEBUG
printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-2],num[len-power-2]-55,pow(16,power),power);
#endif
result+=(num[len-power-2]-55)*pow(16,power);
}
else
{
#if DEBUG
printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-2],num[len-power-2]-87,pow(16,power),power);
#endif
result+=(num[len-power-2]-87)*pow(16,power);
}
--power;
}
}
if(type==3)//binary
{
power-=1;
while(power>=0)
{
#if DEBUG
printf("\nnum[i]=%c,=%d,pow=%f,power=%d\n",num[len-power-1],num[len-power-1]-47,pow(2,power),power);
#endif
result+=(num[len-power-1]-48)*pow(2,power);
--power;
}
}
printf("\tDec:[%d]\n",result);
return result;
}
int ToBiNum(char *num,const int type,const int len)//working
{
if(type==1)//hex to bin
{
num_dec=ToDecNum(num,type,len);
//printf("num_dec:%d\n",num_dec);
ToBiNum(num,DEC,len);
}
if(type==2)//dec to bin
{
stack *s=(stack *)malloc(sizeof(stack)); s->len=0;
int *base_p=(int *)s->base;
int *top_p=(int *)s->top;
base_p=(int *)malloc(4*len*sizeof(int));
top_p=base_p;
if(num_dec==0)
{
int i=0;
int power=1;
while(i<len)//char to int;
{
if(num[len-i-1]<'0'||num[len-i-1]>'9')
continue;
num_dec+=power*(num[len-i-1]-48);
power*=10;
i++;
}
}
while(num_dec!=0)
{
*top_p++=num_dec%2;
num_dec/=2;
s->len++;
}
printf("\tBin:[");
--top_p;
while(s->len>0)
{
printf("%d",*top_p--);
s->len--;
}
printf("]\n");
free(base_p);
free(s);
}
return 1;
}
int NumConversion()
{
int len=1;
char *num;
while(len!=0)
{
num=(char *)malloc(20*sizeof(char));
puts("[**Input]:");
scanf("%s",num);
len=strlen(num);
if(num[len-1]=='D'||num[len-1]=='d')
{//decimal input
ToBiNum(num,DEC,len-1);
ToHexNum(num,DEC,len-1);
}
else if(num[len-1]=='H'||num[len-1]=='h')
{//hex input
ToBiNum(num,HEX,len);
}
else
{//binary input
ToHexNum(num,BIN,len);
}
free(num);
num=NULL;
}
if(num!=NULL)
{
free(num);
}
return 1;
}
int main()
{
NumConversion();
return 1;
}