伟大的玥玥 发表于 2016-12-18 15:38:20

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

本帖最后由 伟大的玥玥 于 2016-12-27 17:19 编辑

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

wssokl 发表于 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

lzgw 发表于 2016-12-18 21:05:47

#include <stdio.h>
int main ()
{
        char s, i=-1;//假定20位数的十六进制数字,输入判定就不写了,你自己加
        scanf ("%s",s);
        while (s[++i])
        {
                switch (s)
                {
                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;
}

代码农民 发表于 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;
}

四十二 发表于 2016-12-21 00:03:30

为了这个鱼币我可以给你写,不过你总得把题目完整的说明白啊

张天舒 发表于 2016-12-21 12:52:19

进制转换问题

伟大的玥玥 发表于 2016-12-27 17:19:23

四十二 发表于 2016-12-21 00:03
为了这个鱼币我可以给你写,不过你总得把题目完整的说明白啊

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

AsmodeusBaal 发表于 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;
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=='\0')
         break;
      }
         
       X_B(r,k);
       q=1;
       break;
   case 2: printf("\n请输入您想要转化的数:");
       fflush(stdin);
      gets(r);
      for(k=0;;k++)
      {
         if(r=='\0')
         break;
      }
         
       X_O(r,k);
       q=1;
       break;
   case 3: printf("\n请输入您想要转化的数:");
       fflush(stdin);
      gets(r);
      for(k=0;;k++)
      {
         if(r=='\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;
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=result%8;
result=result/8;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else   
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
   printf("%d",p);
}
printf("\n");
}   
}
   

void B_X(int a)
{
int i,j,k,s=0;
char p;
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=result%16;
result=result/16;
if (p>10)
{
   switch(p)
   {
   case 10: p='A';
      break;
   case 11: p='B';
      break;
   case 12:    p='C';
      break;
   case 13:    p='D';
      break;
   case 14:    p='E';
      break;
   case 15:    p='F';
      break;
   }
}
else p+=48;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else   
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
   printf("%c",p);
}
printf("\n");
}
}
///////以下为:八进制转换为二进制,十进制,十六进制.
void O_B(int a)
{
int i,j,k,s=0;
int result=0;
int p;
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=result%2;
result=result/2;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else   
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
   printf("%d",p);
}
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;
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=result%16;
result=result/16;
if(p<10)
   p+=48;
else
{
   switch(p)
   {
   case 10: p='A';
      break;
   case 11: p='B';
      break;
   case 12:    p='C';
      break;
   case 13:    p='D';
      break;
   case 14:    p='E';
      break;
   case 15:    p='F';
      break;
   }
}
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else   
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
   printf("%c",p);
}
printf("\n");
}
}
///////以下为:十六进制转换为十进制,二进制,八进制.
void X_D(char a[],int k)
{
int i,j,s=0;
int result=0;
int b;
for(i=0;i<k;i++)
{
if(a<='9'&&a>='1')
{ b=a-48;
      
}
else
{
   switch(a)
   {
   case 'A': b=10;
      break;
   case 'B': b=11;
      break;
   case 'C':   b=12;
      break;
   case 'D':   b=13;
      break;
   case 'E':   b=14;
      break;
   case 'F':   b=15;
      break;
   case 'a': b=10;
      break;
   case 'b': b=11;
      break;
   case 'c':   b=12;
      break;
   case 'd':   b=13;
      break;
   case 'e':   b=14;
      break;
   case 'f':   b=15;
      break;
   default:s=1;
      
   }
   
}
}
for(i=1,j=k-1;j>=0;j--,i*=16)
{
result+=b*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;
int p;
for(i=0;i<k;i++)
{
if(a<='9'&&a>='1')
   b=a-48;
else
{
   switch(a)
   {
   case 'A': b=10;
      break;
   case 'B': b=11;
      break;
   case 'C':   b=12;
      break;
   case 'D':   b=13;
      break;
   case 'E':   b=14;
      break;
   case 'F':   b=15;
      break;
   case 'a': b=10;
      break;
   case 'b': b=11;
      break;
   case 'c':   b=12;
      break;
   case 'd':   b=13;
      break;
   case 'e':   b=14;
      break;
   case 'f':   b=15;
      break;
   default: s=1;
      
   }
}
}
for(j=k-1,i=1;j>=0;j--,i*=16)
{
result+=b*i;
}
for(j=0;result!=0;j++)
{
p=result%2;
result=result/2;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else   
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
   printf("%d",p);
}
printf("\n");
}
}
   
void X_O(char a[],int k)
{
int i,j,s=0;
int result=0;
int b;
int p;
for(i=0;i<k;i++)
{
if(a<='9'&&a>='1')
   b=a-48;
else
{
   switch(a)
   {
   case 'A': b=10;
      break;
   case 'B': b=11;
      break;
   case 'C':   b=12;
      break;
   case 'D':   b=13;
      break;
   case 'E':   b=14;
      break;
   case 'F':   b=15;
      break;
   case 'a': b=10;
      break;
   case 'b': b=11;
      break;
   case 'c':   b=12;
      break;
   case 'd':   b=13;
      break;
   case 'e':   b=14;
      break;
   case 'f':   b=15;
      break;
   default: s=1;
   }
}
}
for(j=k-1,i=1;j>=0;j--,i*=16)
{
result+=b*i;
}
for(j=0;result!=0;j++)
{
p=result%8;
result=result/8;
}
if(s==1)
printf("您的输入有误!请重新输入\n");
else   
{
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
   printf("%d",p);
}
printf("\n");
}
}
///////以下为:十进制转换为二进制,八进制,十六进制.
void D_B(int a)
{
int j,k;
int p;
for(j=0;a!=0;j++)
{
p=a%2;
a=a/2;
}
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p);
}
printf("\n");
}
   
void D_O(int a)
{
int j,k;
int p;
for(j=0;a!=0;j++)
{
p=a%8;
a=a/8;
}
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%d",p);
}
printf("\n");
}

void D_X(int a)
{
int j,k;
int p;
for(j=0;a!=0;j++)
{
p=a%16;
a=a/16;
if(p<10)
   p+=48;
else
{
   switch(p)
   {
   case 10: p='A';
      break;
   case 11: p='B';
      break;
   case 12:    p='C';
      break;
   case 13:    p='D';
      break;
   case 14:    p='E';
      break;
   case 15:    p='F';
      break;
   }
}
}
printf("\n转换后的数为:");
for(k=j-1;k>=0;k--)
{
printf("%c",p);
}
printf("\n");
}
这是C++的代码我从CSDN上转载的

鱼油小白 发表于 2017-1-19 14:21:52

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a;
    char b;
    scanf("%d",&a);
    itoa(a,b,2);
    printf("%s",b);
}
页: [1]
查看完整版本: 求十六进制转为二进制的C语言代码