鱼C论坛

 找回密码
 立即注册
查看: 3493|回复: 8

求十六进制转为二进制的C语言代码

[复制链接]
发表于 2016-12-18 15:38:20 | 显示全部楼层 |阅读模式
66鱼币
本帖最后由 伟大的玥玥 于 2016-12-27 17:19 编辑

问题是这样的,我是在linux中先抓包,抓包后的数据是以每2位空格的十六进制存储在自己申请的一段内存中的,如EF 2F 4E,我的问题是如何把这个转换为对应的二进制,如111011110010111110001110,注意十六进制不是我键盘输入的,是读取的数据。这里应该要涉及到移位的问题。(之所以要做这个是要把数据读出来做异或,这样就要先把十六进制转换为相应的二进制)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-18 17:10:09 | 显示全部楼层
有一个非常简单的算法,直接映射:0 00001 00012 00103 00114 01005 01016 01107 01118 10009 1001A 1010B 1011C 1100D 1101E 1110F 1111每位十六进制数用四位二进制表示 。例如:(1DE)16 =(1 1101 1110)2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-18 21:05:47 | 显示全部楼层
#include <stdio.h>
int main ()
{
        char s[20], i=-1;//假定20位数的十六进制数字,输入判定就不写了,你自己加
        scanf ("%s",s);
        while (s[++i])
        {
                switch (s[i])
                {
                case 'a':
                        printf ("1010 ");
                        break;
                case 'b':
                        printf ("1011 ");
                        break;
                case 'c':
                        printf ("1100 ");
                        break;
                case 'd':
                        printf ("1101 ");
                        break;
                case 'e':
                        printf ("1110 ");
                        break;
                case 'f':
                        printf ("1111 ");
                        break;
                case '1':
                        printf ("0001 ");
                        break;
                case '2':
                        printf ("0010 ");
                        break;
                case '3':
                        printf ("0011 ");
                        break;
                case '4':
                        printf ("0100 ");
                        break;
                case '5':
                        printf ("0101 ");
                        break;
                case '6':
                        printf ("0110 ");
                        break;
                case '7':
                        printf ("0111 ");
                        break;
                case '8':
                        printf ("1000 ");
                        break;
                case '9':
                        printf ("1001 ");
                        break;
                case '0':
                        printf ("0000 ");
                        break;
                default :
                        exit (0);
                }
        }
        printf("\n");
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-20 23:39:36 | 显示全部楼层
本帖最后由 代码农民 于 2016-12-21 00:37 编辑
#include <stdio.h>
#define N 32
    /*    如果是32位的话    */

int
main()
{
    unsigned n, a;              /*  如果需要更长的,可以用unsigned long  */
    int i;
   
    scanf( "%x", &n );        /*  %X, %i也行 , 范围0x0~0xFFFFFFFF(8个F)  */
    for( i = 0; i < N; ++i )
    {
        a = n;
        printf( "%d",  ( a << i ) >> N - 1 );
    }

    printf( "\n" );
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-21 00:03:30 | 显示全部楼层
为了这个鱼币我可以给你写,不过你总得把题目完整的说明白啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-21 12:52:19 | 显示全部楼层
进制转换问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-12-27 17:19:23 | 显示全部楼层
四十二 发表于 2016-12-21 00:03
为了这个鱼币我可以给你写,不过你总得把题目完整的说明白啊

问题是这样的,我是在linux中先抓包,抓包后的数据是以每2位空格的十六进制存储在自己申请的一段内存中的,如EF 2F 4E,我的问题是如何把这个转换为对应的二进制,如111011110010111110001110,注意十六进制不是我键盘输入的,是读取的数据。这里应该要涉及到移位的问题。(之所以要做这个是要把数据读出来做异或,这样就要先把十六进制转换为相应的二进制)
我来回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-1 18:40:00 | 显示全部楼层
本帖最后由 AsmodeusBaal 于 2017-1-1 18:41 编辑
#include<stdio.h>  
#include<string.h>  
#include<stdlib.h>  
void D_B(int);  
void D_O(int);  
void D_X(int);  
void B_D(int);  
void B_O(int);  
void B_X(int);  
void O_B(int);  
void O_D(int);  
void O_X(int);  
void X_B(char r[],int k);  
void X_D(char r[],int k);  
void X_O(char r[],int k);  
void main()  
{  
 int i,j,k=0;  
 int q;  
 char r[10];  
 printf("+=============================================================+\n");  
 printf("|            欢  迎  使  用  进  制  转  换  程  序           |\n");  
 printf("+=============================================================+\n");  
 printf("  注 : 本 版 本 只 做 正 整 数 的 进 制 转 换 ! !");  
 do  
 {   
  q=0;  
  //fflush(stdin);  
  printf("\n请选择需要被转换的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");  
  scanf("%d",&i);  
  switch (i)  
  {  
   case 1: printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");  
     scanf("%d",&j);  
     switch(j)  
     {  
     case 1: printf("\n同进制之间不用转化!\n");  
       q=1;  
       break;  
     case 2: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       B_O(k);  
       q=1;  
       break;  
     case 3: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       B_D(k);  
       q=1;  
       break;  
     case 4: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       B_X(k);  
       q=1;  
       break;  
     case 0:   
        
       printf("谢谢使用!!");  
         
     }  
     break;  
   case 2: printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");  
     scanf("%d",&j);  
     switch(j)  
     {  
     case 2: printf("\n同进制之间不用转化!\n");  
        q=1;  
       break;  
     case 1: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       O_B(k);  
       q=1;  
       break;  
     case 3: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       O_D(k);  
       q=1;  
       break;  
     case 4: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       O_X(k);  
       q=1;  
       break;  
     case 0:   
       printf("谢谢使用!!");  
     }   
     break;  
   case 3: printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");  
     scanf("%d",&j);  
     switch(j)  
     {  
     case 3: printf("\n同进制之间不用转化!\n");  
        q=1;  
        
       break;  
     case 1: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       D_B(k);  
       q=1;  
       break;  
     case 2: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       D_O(k);  
       q=1;  
       break;  
     case 4: printf("\n请输入您想要转化的数:");  
       scanf("%d",&k);  
       D_X(k);  
       q=1;  
       break;  
     case 0:   
        
       printf("谢谢使用!!");  
     }   
     break;  
   case 4: printf("\n请选择转换后的进制:\n0、退出\n1、二进制\n2、八进制\n3、十进制\n4、十六进制\n");  
     scanf("%d",&j);  
     switch(j)  
     {  
     case 4: printf("\n同进制之间不用转化!\n");  
        q=1;  
       break;  
     case 1: printf("\n请输入您想要转化的数:");  
        fflush(stdin);  
        gets(r);  
        for(k=0;;k++)  
        {  
         if(r[k]=='\0')  
         break;  
        }  
         
       X_B(r,k);  
       q=1;  
       break;  
     case 2: printf("\n请输入您想要转化的数:");  
       fflush(stdin);  
        gets(r);  
        for(k=0;;k++)  
        {  
         if(r[k]=='\0')  
         break;  
        }  
         
       X_O(r,k);  
       q=1;  
       break;  
     case 3: printf("\n请输入您想要转化的数:");  
       fflush(stdin);  
        gets(r);  
        for(k=0;;k++)  
        {  
         if(r[k]=='\0')  
         break;  
        }  
       X_D(r,k);  
       q=1;  
       break;  
     case 0:   
      printf("谢谢使用!!");  
         
     }  
     break;  
   case 0: printf("\n谢谢使用!\n");  
      
  }  
 }while(q==1);  
}  
 ///////以下为:  二进制转换为十进制,八进制,十六进制.  
void B_D(int a)  
{  
 int i,s=0;  
 int result=0;  
 for(i=1;a!=0;i*=2)  
 {  
  if(a%10>1)  
  {   
   s=1;  
   break;  
  }  
  else  
  {  
   result+=(a%10)*i;  
   a=a/10;  
  }  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else  
 printf("\n转换后的数为:%d\n",result);  
}  
   
void B_O(int a)  
{  
 int i,j,k,s=0;  
 int p[30];  
 int result=0;  
 for(i=1;a!=0;i*=2)  
 {  
  if(a%10>1)  
  {   
   s=1;  
   break;  
  }  
  else  
  {  
   result+=(a%10)*i;  
   a=a/10;  
  }  
 }  
 for(j=0;result!=0;j++)  
 {  
  p[j]=result%8;  
  result=result/8;  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:");  
  for(k=j-1;k>=0;k--)  
  {  
   printf("%d",p[k]);  
  }  
  printf("\n");  
 }   
}  
   
  
void B_X(int a)  
{  
 int i,j,k,s=0;  
 char p[30];  
 int result=0;  
 for(i=1;a!=0;i*=2)  
 {  
  if(a%10>1)  
  {   
   s=1;  
   break;  
  }  
  else  
  {  
   result+=(a%10)*i;  
   a=a/10;  
  }  
 }  
 for(j=0;result!=0;j++)  
 {  
  p[j]=result%16;  
  result=result/16;  
  if (p[j]>10)  
  {  
   switch(p[j])  
   {  
   case 10: p[j]='A';  
      break;  
   case 11: p[j]='B';  
      break;  
   case 12:    p[j]='C';  
      break;  
   case 13:    p[j]='D';  
      break;  
   case 14:    p[j]='E';  
      break;  
   case 15:    p[j]='F';  
      break;  
   }  
  }  
  else p[j]+=48;  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:");  
  for(k=j-1;k>=0;k--)  
  {  
   printf("%c",p[k]);  
  }  
  printf("\n");  
 }  
}  
 ///////以下为:  八进制转换为二进制,十进制,十六进制.  
void O_B(int a)  
{  
 int i,j,k,s=0;  
 int result=0;  
 int p[30];  
 for(i=1;a!=0;i*=8)  
 {if(a%10>7)  
  {   
   s=1;  
   break;  
  }  
  else  
  {  
   result+=(a%10)*i;  
   a=a/10;  
  }  
 }  
 for(j=0;result!=0;j++)  
 {  
  p[j]=result%2;  
  result=result/2;  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:");  
  for(k=j-1;k>=0;k--)  
  {  
   printf("%d",p[k]);  
  }  
  printf("\n");  
 }  
}  
   
void O_D(int a)  
{  
 int i,s=0;  
 int result=0;  
 for(i=1;a!=0;i*=8)  
 {  
  if(a%10>7)  
  {   
   s=1;  
   break;  
  }  
  else  
  {  
   result+=(a%10)*i;  
   a=a/10;  
  }  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:%d\n",result);  
 }  
}  
   
void O_X(int a)  
{  
 int i,j,k,s=0;  
 char p[30];  
 int result=0;  
 for(i=1;a!=0;i*=8)  
 {  
  if(a%10>7)  
  {   
   s=1;  
   break;  
  }  
  else  
  {  
   result+=(a%10)*i;  
   a=a/10;  
  }  
 }  
 for(j=0;result!=0;j++)  
 {  
  p[j]=result%16;  
  result=result/16;  
  if(p[j]<10)  
   p[j]+=48;  
  else  
  {  
   switch(p[j])  
   {  
   case 10: p[j]='A';  
      break;  
   case 11: p[j]='B';  
      break;  
   case 12:    p[j]='C';  
      break;  
   case 13:    p[j]='D';  
      break;  
   case 14:    p[j]='E';  
      break;  
   case 15:    p[j]='F';  
      break;  
   }  
  }  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:");  
  for(k=j-1;k>=0;k--)  
  {  
   printf("%c",p[k]);  
  }  
  printf("\n");  
 }  
}  
 ///////以下为:  十六进制转换为十进制,二进制,八进制.  
void X_D(char a[],int k)  
{  
 int i,j,s=0;  
 int result=0;  
 int b[50];  
 for(i=0;i<k;i++)  
 {  
  if(a[i]<='9'&&a[i]>='1')  
  { b[i]=a[i]-48;  
       
  }  
  else  
  {  
   switch(a[i])  
   {  
   case 'A': b[i]=10;  
      break;  
   case 'B': b[i]=11;  
      break;  
   case 'C':   b[i]=12;  
      break;  
   case 'D':   b[i]=13;  
      break;  
   case 'E':   b[i]=14;  
      break;  
   case 'F':   b[i]=15;  
      break;  
   case 'a': b[i]=10;  
      break;  
   case 'b': b[i]=11;  
      break;  
   case 'c':   b[i]=12;  
      break;  
   case 'd':   b[i]=13;  
      break;  
   case 'e':   b[i]=14;  
      break;  
   case 'f':   b[i]=15;  
      break;  
   default:  s=1;  
        
   }  
     
  }  
 }  
 for(i=1,j=k-1;j>=0;j--,i*=16)  
 {  
  result+=b[j]*i;  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:%d",result);  
 }  
}  
   
  
void X_B(char a[],int k)  
{  
 int i,j,s=0;  
 int result=0;  
 int b[50];  
 int p[30];  
 for(i=0;i<k;i++)  
 {  
  if(a[i]<='9'&&a[i]>='1')  
   b[i]=a[i]-48;  
  else  
  {  
   switch(a[i])  
   {  
   case 'A': b[i]=10;  
      break;  
   case 'B': b[i]=11;  
      break;  
   case 'C':   b[i]=12;  
      break;  
   case 'D':   b[i]=13;  
      break;  
   case 'E':   b[i]=14;  
      break;  
   case 'F':   b[i]=15;  
      break;  
   case 'a': b[i]=10;  
      break;  
   case 'b': b[i]=11;  
      break;  
   case 'c':   b[i]=12;  
      break;  
   case 'd':   b[i]=13;  
      break;  
   case 'e':   b[i]=14;  
      break;  
   case 'f':   b[i]=15;  
      break;  
   default: s=1;  
        
   }  
  }  
 }  
 for(j=k-1,i=1;j>=0;j--,i*=16)  
 {  
  result+=b[j]*i;  
 }  
  for(j=0;result!=0;j++)  
 {  
  p[j]=result%2;  
  result=result/2;  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:");  
  for(k=j-1;k>=0;k--)  
  {  
   printf("%d",p[k]);  
  }  
  printf("\n");  
 }  
}  
   
void X_O(char a[],int k)  
{  
 int i,j,s=0;  
 int result=0;  
 int b[30];  
 int p[30];  
 for(i=0;i<k;i++)  
 {  
  if(a[i]<='9'&&a[i]>='1')  
   b[i]=a[i]-48;  
  else  
  {  
   switch(a[i])  
   {  
   case 'A': b[i]=10;  
      break;  
   case 'B': b[i]=11;  
      break;  
   case 'C':   b[i]=12;  
      break;  
   case 'D':   b[i]=13;  
      break;  
   case 'E':   b[i]=14;  
      break;  
   case 'F':   b[i]=15;  
      break;  
   case 'a': b[i]=10;  
      break;  
   case 'b': b[i]=11;  
      break;  
   case 'c':   b[i]=12;  
      break;  
   case 'd':   b[i]=13;  
      break;  
   case 'e':   b[i]=14;  
      break;  
   case 'f':   b[i]=15;  
      break;  
   default: s=1;  
   }  
  }  
 }  
 for(j=k-1,i=1;j>=0;j--,i*=16)  
 {  
  result+=b[j]*i;  
 }  
  for(j=0;result!=0;j++)  
 {  
  p[j]=result%8;  
  result=result/8;  
 }  
 if(s==1)  
  printf("您的输入有误!请重新输入\n");  
 else   
 {  
  printf("\n转换后的数为:");  
  for(k=j-1;k>=0;k--)  
  {  
   printf("%d",p[k]);  
  }  
  printf("\n");  
 }  
}  
///////以下为:  十进制转换为二进制,八进制,十六进制.  
void D_B(int a)  
{  
 int j,k;  
 int p[30];  
 for(j=0;a!=0;j++)  
 {  
  p[j]=a%2;  
  a=a/2;  
 }  
 printf("\n转换后的数为:");  
 for(k=j-1;k>=0;k--)  
 {  
  printf("%d",p[k]);  
 }  
 printf("\n");  
}  
   
void D_O(int a)  
{  
 int j,k;  
 int p[30];  
 for(j=0;a!=0;j++)  
 {  
  p[j]=a%8;  
  a=a/8;  
 }  
 printf("\n转换后的数为:");  
 for(k=j-1;k>=0;k--)  
 {  
  printf("%d",p[k]);  
 }  
 printf("\n");  
}  
  
void D_X(int a)  
{  
 int j,k;  
 int p[30];  
 for(j=0;a!=0;j++)  
 {  
  p[j]=a%16;  
  a=a/16;  
  if(p[j]<10)  
   p[j]+=48;  
  else  
  {  
   switch(p[j])  
   {  
   case 10: p[j]='A';  
      break;  
   case 11: p[j]='B';  
      break;  
   case 12:    p[j]='C';  
      break;  
   case 13:    p[j]='D';  
      break;  
   case 14:    p[j]='E';  
      break;  
   case 15:    p[j]='F';  
      break;  
   }  
  }  
 }  
 printf("\n转换后的数为:");  
 for(k=j-1;k>=0;k--)  
 {  
  printf("%c",p[k]);  
 }  
 printf("\n");  
}  
这是C++的代码我从CSDN上转载的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-19 14:21:52 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a;
    char b[100];
    scanf("%d",&a);
    itoa(a,b,2);
    printf("%s",b);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 06:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表