⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x.c

📁 2进制转16进制C程序
💻 C
字号:

//进制转换程序FOR  赵振江
//程序编写:扣子

#include "math.h"
#include "conio.h"
#include "hec.h"
#define back textbackground
#define winer 5,8,80,9 /*后面要用到的2、8、10、16进制数窗口的数据*/
#define winba 5,11,48,11
#define winshi 5,13,42,13
#define winshiliu 5,15,38,15

void csh()
{window(1,1,80,25); /*先把屏幕清除,再把光标定位到2列、8行*/
 back(0);
 clrscr();
 gotoxy(2,8);
 printf("2:"); /*输出2、8、10、16等数字*/
 gotoxy(2,11);
 printf("8:");
 gotoxy(2,13);
 printf("10:");
 gotoxy(2,15);
 printf("16:");
 window(winba);  /*8,42bit  先输出8进制数的输入框,再是10、16,最后再是2进制的输入框,这样最后光标就定位到2进制框里*/
 back(9);
 textcolor(15);
 clrscr();
 window(winshi); /*10,35bit*/
 back(9);
 textcolor(15);
 clrscr();
 window(winshiliu); /*16,32bit*/
 back(9);
 textcolor(15);
 clrscr();
 window(winer); /*2,128bit*/
 back(9);
 textcolor(15);
 clrscr();
}

void outresult(char s[],int count,char d)
{int i,b=0;
 switch(d)
 {case 'e': window(winer); break;
  case 'b': window(winba); break;
  case 's': window(winshi); break;
  case 'l': window(winshiliu); break;}
 clrscr();
 if (count==-2) /*2、8、16数转为10进制数时,如果超过相应的位数,就返回-2,这里当count是-2时就输出数太大了。*/
     printf("The number is too big!");
 else
     {if (d=='e') /*如果是2进制就话,一串很长,不容易看,所以输出6位数就空一格*/
   for (i=0;i<=count;i++)
       {if ((i+b)==75) /*如果输出的数和空格有75位了就跳到第2行*/
     gotoxy(1,2);
        if (i%6==0 && i!=0) /*i!=0是第一次时就不输出空格了*/
     {printf("%c",32); b++;}
        printf("%c",s[i]);}
      else
   printf("%s",s); } /*如果不是2进制数就直接输出字符串*/
}

void dinwei(int d)
{switch(d)
 {case 1: window(winer); break; /*只要用window函数用一次就可以把光标定在相应的位置*/
  case 2: window(winba); break;
  case 3: window(winshi); break;
  case 4: window(winshiliu); break;}
}

void er(char c)
{char a[130],s[43],s2[10],s3[33]; /*a是存储2进制数据的字符串,s是8进制的,s2是10进制的,s3是16进制的*/
 int count=0,sc,s2c,s3c; /*这里sc,s2c,s3c表示的是调用转换函数后8、10、16进制数的位数*/
 window(winer); /*重新定位清屏*/
 clrscr();
 printf("%c",c); /*输出形参c的值,存储到a里去,并使count+1*/
 a[count++]=c;
 if (count>0) /*这一行本来是原来检查数值是否合要求时所用的一句,把检查放到getkey函数后,这本来是要删的,但想想删的话要影响到下面多行排版问题,且有2、8、10、16四个函数,所以干脆不删了,也不多多少事*/
     {while(1)
      {c=getch();
       if (c==0) {c=getch(); continue;} /*如果按的是功能键的话,就再把功能键的第二字节接收后再撤消这次循环*/
       if (c==27) /*是ESC的话就退出循环返到getkey函数*/
    {clrscr();
     break;}
       if (c==13) /*如果输入完成后输入回车就把a的最后一个字节加上'\0'并使到'\0'的字节数减一个,再调用转换函数*/
    {a[count--]='\0';
     sc=er_ba(a,count,s); /*调用2进制转8进制函数,count告诉他2进制的位数,s存储8进制数的字符串,由er_ba函数返回的值是8进制数的位数*/
     outresult(s,sc,'b'); /*得到8进制字符串和位数后再调用outresult(输出)函数,'b'表示要输出的是8进制数,以下类似*/
     s2c=er_shi(a,count,s2);
     outresult(s2,s2c,'s');
     s3c=er_shiliu(a,count,s3);
     outresult(s3,s3c,'l');
     window(winer); /*调用完后,光标定位到16进制数的位置,我就再定到er进制数的位置*/
     break;}
       else
    {if ((c==48 || c==49) && count<129) /*如果是0或1,和输入的位数小于129位,就显示并存储,实际上你除了第一位数要是0外,后面还可以输出128位数。如果到了第75位数,就跳到第1列、2行我不使用cprintf函数,是因为好象到了第二行用退格键不太行*/
  {if (count==75) gotoxy(1,2);
   printf("%c",c);
   a[count++]=c;}
     else
  if (c==8) /*如果是退格就删除前一个字节,如果到了75位就跳到1行的最后一列*/
      {if (count==75) gotoxy(76,1);
       printf("\b \b");
       if (count>1)
    count--;
       else
    break;}  }
  }
 }
 }

void ba(char c)
{char b[43],s[130],s2[10],s3[33]; /*2进制讲了,其他的就差不多了,格式都一样*/
 int count=0,sc,s2c,s3c;
 window(winba);
 clrscr();
 printf("%c",c);
 b[count++]=c;
 if (count>0)
     {while(1)
      {c=getch();
       if (c==0) {c=getch(); continue;}
       if (c==27)
    {clrscr();
     break;}
       if (c==13)
    {b[count--]='\0';
     sc=ba_er(b,count,s);
     outresult(s,sc,'e');
     s2c=ba_shi(b,count,s2);
     outresult(s2,s2c,'s');
     s3c=ba_shiliu(b,count,s3);
     outresult(s3,s3c,'l');
     window(winba);
     break;}
       else
    {if (c>=48 && c<=55 && count<42)
  {printf("%c",c);
   b[count++]=c;}
     else
  if (c==8)
      {printf("\b \b");
       if (count>1)
    count--;
       else
    break;} }  }
  }
}

void shi(char c)
{char x[11],s[130],s2[43],s3[33]; /*由于10进制数要先由字符串转成数才能进行转换,所以就只能是十位的长整型了,要是谁能向8进制转为2进制一样直接由字符串转字符串,告诉我一声,谢了*/
 int count=0,sc,s2c,s3c;
 window(winshi);
 clrscr();
 x[count++]=c;
 printf("%c",c);
 if (count>0)
     {while(1)
      {c=getch();
       if (c==0) {c=getch(); continue;}
       if (c==27)
    {clrscr();
     break;}
       if (c==13)
    {x[count--]='\0';
     sc=shi_er(x,count,s);
     outresult(s,sc,'e');
     s2c=shi_ba(x,count,s2);
     outresult(s2,s2c,'b');
     s3c=shi_shiliu(x,count,s3);
     outresult(s3,s3c,'l');
     window(winshi);
     break;}
       else
    {if (c>=48 && c<=57 && count<10)
  {printf("%c",c);
   x[count++]=c;}
     else
  if (c==8)
      {printf("\b \b");
       if (count>1)
    count--;
       else
    break;}  }  }
     }
}

void shiliu(char c)
{int count=0,sc,s2c,s3c;
 char n[33],s[130],s2[43],s3[10];
 window(winshiliu);
 clrscr();
 n[count++]=c;
 printf("%c",c);
 if (count>0)
     {while(1)
      {c=getch();
       if (c==0) {c=getch(); continue;}
       if (c==27)
    {clrscr();
     break;}
       if (c==13)
    {n[count--]='\0';
     sc=shiliu_er(n,count,s);
     outresult(s,sc,'e');
     s2c=shiliu_ba(n,count,s2);
     outresult(s2,s2c,'b');
     s3c=shiliu_shi(n,count,s3);
     outresult(s3,s3c,'s');
     window(winshiliu);
     break;}
       else
    {if ((c>=48 && c<=57 || c>='A' && c<='F' || c>='a' && c<='f') && count<32)
  {n[count++]=c;
   printf("%c",c);}
     else
  if (c==8)
      {printf("\b \b");
       if (count>1)
    count--;
       else
    break;}  }   }
  }
}

void getkey()
{int danqiang=1; /*让程序知道当前是在哪个位置,1就是2进制的位置,2是8进制的位置等等*/
 int c; /*接收键盘的输入*/
 while(1)
 {c=getch();
  if (c==27) break; /*在循环里一直等待着输入,是ESC(27)时就退出*/
  if (c==0)  /*如果是上下键就调用dinwei函数*/
      {c=getch();
       if (danqiang>1 && c==72) /*如果是上,且当前的位置不是2进制,就调用dinwei函数,并danqiang减1*/
    dinwei(--danqiang); 
       if (danqiang<4 && c==80) /*如果是下,且当前的位置不是16进制,就调用dinwei函数,并danqiang加1*/
    dinwei(++danqiang);}
  else
      {if (c>=48 && c<=57 || c>='A' && c<='F' || c>='a' && c<='f') /*如果是0-9或a-f,A-F,就按当前的位置调用相应的函数*/
    switch(danqiang)
    {case 1: if (c==48) er(c); break;   /*因为我不可以进行负数之间的转换,所以2进制第一位数必须是0,本来if (c==48)我是放到er函数里去的,可我突然想起,当光标在2进制的位置时,你按其他键时,不管是不是0,getkey函数都会调用er函数,不是0就又返回去,这样当然不好,所以我就把这种检查放到getkey函数里,下面类似*/

     case 2: if (c>=49 && c<=55) ba(c); break;
     case 3: if (c>=49 && c<=57) shi(c); break;
     case 4: if (c>=49 && c<=57 || c>='A' && c<='F' || c>='a' && c<='f') shiliu(c); break;}  }
      }
}

void main()
{csh(); /*调用初始化函数*/
 getkey(); /*调用接收键盘函数*/
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -