如何在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中将十六进制字符串转换为二进制字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Objective C 中将十六进制数转换为整数和字符串?
如何在 Swift 中将十六进制字符串转换为 CString?