如何在C中将十六进制字符串转换为二进制字符串?

Posted

技术标签:

【中文标题】如何在C中将十六进制字符串转换为二进制字符串?【英文标题】:How to convert an hexadecimal string into a binary string in C? 【发布时间】:2021-09-30 18:45:05 【问题描述】:

我的范围是将十六进制字符串转换为二进制字符串。在我制作的程序中,我只做一个打印。如何将每个十六进制字符(在 hexa 数组中)转换为 4 位(在 binarynum 数组中)?

示例

hexa[100] = "ff" -> binarynum[100] = "11111111"

这是我的代码:

#include <stdio.h>
#include <string.h>

int main()

    char binarynum[100];
    long int i = 0;

    char hexa[100] = "fff";
    while (hexa[i])
    
        switch (hexa[i])
        
        case '0':
            printf("0000"); 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 '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 '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;
        default:
            printf("\n Invalid hexa digit %c ", hexa[i]);
            return 0;
        
        i++;
    
    return 0;

【问题讨论】:

你能说出输出数组应该有多大吗?你当然可以。你能计算每个十六进制数字的输出位数组中的索引吗?当然你也可以。 您的第一步是确定您希望使用哪种编程语言编写程序:C 或 C++。它们是两种完全不同的语言。 您拥有正确的模式和合理的方法来执行映射。现在只需将模式放入更有用的数据类型中,例如 stdint 的uint8_t,并且可能需要进行一些位移以使模式处于正确的 nyble 中。你是如此亲密,我建议你尝试自己完成这项工作,并在需要时询问有关尝试的问题。 提示:你可以使用case 'a': case 'A': .....; break;来处理大小写 程序是用 C 语言编写的(它写在问题中)。当我做 strcat 时,我遇到了很多问题。有没有一种简单的方法可以将 4 个字符作为时间添加到六进制数组中?例如,类似于 hex.append("1111") 的东西。感谢您的帮助! 【参考方案1】:

这是一个使用查找表的示例;它假设您要处理 32 位 int,因此结果缓冲区的大小会相应调整。不过,您应该能够根据自己的需要对其进行调整。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

/**
 * Maps our input character onto an array index.  '0' maps to 0,
 * '1' maps to 1, 'a' maps to 10, etc.  C guarantees that decimal
 * digit encodings are sequential, so subtracting `0` from a digit
 * character should map the value correctly.  This code assumes that
 * the encodings for `a` through `f` are sequential (as they are in
 * ASCII and UTF-8 - that *may* not be a valid assumption for
 * other encodings.
 * 
 * If the input character is neither a decimal nor hexadecimal
 * digit, this will map to index 16 which holds an empty string.
 */
#define MAP(c) (isdigit(c) ? c - '0' : (isxdigit(c) ? tolower(c) - 'a' + 10 : 16 ) )

/**
 * Takes an input value off the command line.
 */
int main( int argc, char **argv )

  if ( argc < 2 )
  
    fprintf( stderr, "USAGE: %s number\n", argv[0] );
    exit( EXIT_FAILURE );
  

  /**
   * Convert the command line argument to an integer value.
   */
  int arg = atoi( argv[1] );

  /**
   * Stores the hexadecimal string representation of the input
   * value.
   */
  char buf[9] =  0 ;

  /**
   * This will hold our final binary string
   */
  char result[33] =  0 ;

  /**
   * Our lookup table
   */
  char bits[17][5] =  "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", 
                       "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111", "" ;

  sprintf( buf, "%08x", arg );

  for ( char *b = buf; *b != 0; b++ )
    strcat( result, bits[ MAP(*b) ] );

  printf( "Binary version of %10d (0x%s) = %s\n", arg, buf, result );

  return EXIT_SUCCESS;

还有一些输出:

$ ./map 1
Binary version of          1 (0x00000001) = 00000000000000000000000000000001

$ ./map 1234
Binary version of       1234 (0x000004d2) = 00000000000000000000010011010010

$ ./map 12345678
Binary version of   12345678 (0x00bc614e) = 00000000101111000110000101001110

【讨论】:

以上是关于如何在C中将十六进制字符串转换为二进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C中将无符号字符数组转换为十六进制字符串

如何在 Objective C 中将十六进制数转换为整数和字符串?

如何在 Swift 中将十六进制字符串转换为 CString?

如何在 Python 中将单个字符转换为其十六进制 ASCII 值?

如何在 C++ 中将字节数组转换为十六进制字符串?

如何在python中将单个字符转换为十六进制ascii值