C 将位数组转换为十六进制数

C 将位数组转换为十六进制数,c,C,在将表示数字位的整数数组转换为十六进制之前,最好的方法是什么 我当前尝试一次读取四位,然后尝试打印相应的十六进制字符,但我看不到任何输出 以下是我所拥有的: /** * Maps a 4 bit string in binary to the corresponding * hex digit */ void map_bin_to_hex(char *c) { printf("In mapbin: C = %s\n", c); //This is printin

在将表示数字位的整数数组转换为十六进制之前,最好的方法是什么

我当前尝试一次读取四位,然后尝试打印相应的十六进制字符,但我看不到任何输出

以下是我所拥有的:

 /**
  * Maps a 4 bit string in binary to the corresponding
  * hex digit
  */
 void map_bin_to_hex(char *c)
   {
      printf("In mapbin: C = %s\n", c); //This is printing funny output
      if(!strcmp(c, "0000"))      printf("0");
      else if(!strcmp(c, "0001")) printf("1");
      else if(!strcmp(c, "0010")) printf("2");
      else if(!strcmp(c, "0011")) printf("3");
      else if(!strcmp(c, "0100")) printf("4");
      else if(!strcmp(c, "0101")) printf("5");
      else if(!strcmp(c, "0110")) printf("6");
      else if(!strcmp(c, "0111")) printf("7");
      else if(!strcmp(c, "1000")) printf("8");
      else if(!strcmp(c, "1001")) printf("9");
      else if(!strcmp(c, "1010")) printf("A");
      else if(!strcmp(c, "1011")) printf("B");
      else if(!strcmp(c, "1100")) printf("C");
      else if(!strcmp(c, "1101")) printf("D");
      else if(!strcmp(c, "1110")) printf("E");
      else if(!strcmp(c, "1111")) printf("F");
   }

 /**
  * Reads 4 array elements at a time, passing them to map_bin_to_hex
  */
 void bin_array_to_hex(int *b, int length)
 {
    int i, j, k;

    //read 4 bits 16 times
      for(i = 0; i < 64; i+=4)
      {
         char hexB[4];
         for(k = 0, j = i; j < (i+4); j++, k++)
         {
            hexB[k] = b[j];
            printf("h[%d] = %d\n", k, hexB[k]);
         }
         map_bin_to_hex(hexB);
      }
      printf("\n");
  }

 int main()
 {
   // a 64-bit number represented as an array of bits
   int x[] =[1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,1,
             1,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,0,0,0,0,1,0,1,0,0,0,1,0];
   bin_array_to_hex(x, 64);
  }
你就快到了

替换

hexB[k] = b[j];

另外,
charhexb[4]
需要
字符hexB[5](最后一个字符用于空终止;在调用
map\u bin\u to\u hex
之前,不要忘记设置
hexB[4]='\0';

完成此初始修复后,请查看internet上可用的其他解决方案:您将看到如何在五行或六行中完成整个修复

编辑作为另一个挑战,请查看是否可以使用这两个字符串常量来避免第一个方法中的if-then-else语句的长链:

"0000000100100011010001010110011110001001101010111100110111101111"
"0123456789abcdef"
提示:观察第一个字符串的长度是第二个字符串的四倍

你就快到了

替换

hexB[k] = b[j];

另外,
charhexb[4]
需要
字符hexB[5](最后一个字符用于空终止;在调用
map\u bin\u to\u hex
之前,不要忘记设置
hexB[4]='\0';

完成此初始修复后,请查看internet上可用的其他解决方案:您将看到如何在五行或六行中完成整个修复

编辑作为另一个挑战,请查看是否可以使用这两个字符串常量来避免第一个方法中的if-then-else语句的长链:

"0000000100100011010001010110011110001001101010111100110111101111"
"0123456789abcdef"

提示:观察第一个字符串的长度是第二个字符串的四倍

虽然您的程序将与一起运行,但如果您不使用strcmp,它可以运行得更快。首先,您可以自己编写一个函数来打印字节的十六进制:

void printHexChar(unsigned char value){
    unsigned char lower = value & 0xf; // Use binary 'and' to mask the lower byte
    unsigned char upper = (value & 0xf0) >> 4; // Use binary 'and' to mask upper byte

    if(lower >= 10) // If lower is in range [10-15], than add a value [0-5] on 'a'.
        lower = 'a' + (lower - 10);
    else
        lower = lower + '0'; // It's in range [0-9], so we have to add it to '0'.

    if(upper >= 10) // Same as lower
        upper = 'a' + (upper - 10);
    else
        upper = upper + '0';

    printf("%c%c",upper,lower); // Print out the hexadecimal number
}

这将使您能够以十六进制打印
uint8\u t
(长度为8位的无符号整数)。如果您不知道
>
运算符:它将所有位右移n次。例如,
23>>2=5
因为23=[10111],[10111]>>2=[101]=5。运算符
虽然您的程序将与一起运行,但如果您不使用strcmp,它可以运行得更快。首先,您可以自己编写一个函数来打印字节的十六进制:

void printHexChar(unsigned char value){
    unsigned char lower = value & 0xf; // Use binary 'and' to mask the lower byte
    unsigned char upper = (value & 0xf0) >> 4; // Use binary 'and' to mask upper byte

    if(lower >= 10) // If lower is in range [10-15], than add a value [0-5] on 'a'.
        lower = 'a' + (lower - 10);
    else
        lower = lower + '0'; // It's in range [0-9], so we have to add it to '0'.

    if(upper >= 10) // Same as lower
        upper = 'a' + (upper - 10);
    else
        upper = upper + '0';

    printf("%c%c",upper,lower); // Print out the hexadecimal number
}

这将使您能够以十六进制打印
uint8\u t
(长度为8位的无符号整数)。如果您不知道
>
运算符:它将所有位右移n次。例如,
23>>2=5
因为23=[10111],[10111]>>2=[101]=5。Zeta回答的运算符
,在=10的情况下,应包含在第一个条件中。因此,修改后的代码如下所示


如果Zeta的答案(下限>=10)

,则=10的情况应包含在第一个条件中。因此,修改后的代码如下所示


如果(较低>=10)

谢谢,这是非常有效的。您能告诉我将“0”添加到b[j]中的操作是什么吗?这是某种隐式转换吗?您正在打印
printf
中的字符编号1。添加“0”会将其偏移,使其成为字符“0”或“1”。@HunterMcMillen Dervall解释得非常正确:
strcmp
需要ASCII数字字符串,但原始程序传递的是不可打印的字符字符串。@dasblinkenlight可能不是您所想的线索,但我有一个新的解决方案,它要短得多,我把它贴在上面。@HunterMcMillen,很好。您可以通过使用我的编辑中的字符串常量#2替换字符数组初始值设定项来进一步缩短它-这是一样的:
char hexMap[]=“0123456789ABCDEF”谢谢,这非常有效。您能告诉我将“0”添加到b[j]中的操作是什么吗?这是某种隐式转换吗?您正在打印
printf
中的字符编号1。添加“0”会将其偏移,使其成为字符“0”或“1”。@HunterMcMillen Dervall解释得非常正确:
strcmp
需要ASCII数字字符串,但原始程序传递的是不可打印的字符字符串。@dasblinkenlight可能不是您所想的线索,但我有一个新的解决方案,它要短得多,我把它贴在上面。@HunterMcMillen,很好。您可以通过使用我的编辑中的字符串常量#2替换字符数组初始值设定项来进一步缩短它-这是一样的:
char hexMap[]=“0123456789ABCDEF”转换为
字符
有点繁重。我将使用位移位来获得一个整数,然后
sprintf
我似乎想不出更好的解决方案,有没有更简单的方法将位数组转换为十六进制值?转换为
char
有点重。我将使用位移位来获得一个整数,然后
sprintf
我似乎想不出更好的解决方案,有没有更简单的方法将位数组转换为十六进制值?