在C语言中将十六进制转换为二进制

3
可能有重复:
使用sscanf将长十六进制字符串转换为int数组 我之前看到过一些相关话题,但大多数解决方案都是用Python(该死的Python太容易了!)。
在C中有没有简单的方法? 我知道这在概念上不复杂,但我对C字符串操作和地址处理不熟练。
谢谢大家的帮助!
----------编辑-------------
好的,我解决了那个问题,并且我还有另一个问题(我不想打开新的线程!)。 下面是我修改后的代码,包括函数调用和输出结果。
void htoi(const char *ptr, char *binAddr) {
char value[32] = "";
char ch = *ptr;
int i;
const char* quads[] = {"0000", "0001", "0010", "0011", "0100", "0101",
                     "0110", "0111", "1000", "1001", "1010", "1011",
                     "1100", "1101", "1110", "1111"};

while (ch == ' ' || ch == '\t')
    ch = *(++ptr);

for (i = 0; i < 8; i++) {
    if (ch >= '0' && ch <= '9')
        strncat(value, quads[ch - '0'], 4);
    if (ch >= 'A' && ch <= 'F')
        strncat(value, quads[10 + ch - 'A'], 4);
    if (ch >= 'a' && ch <= 'f')
        strncat(value, quads[10 + ch - 'a'], 4);

    ch = *(++ptr);
    printf("%s\n", value);
}

*binAddr = *value;
}

这是我的函数调用:
char line[11], hexAddr[8], binAddr[32];
htoi(hexAddr, binAddr);
printf("%s\n", binAddr);

这是输入001133c0时的输出结果:
0000
00000000
000000000001
0000000000010001
00000000000100010011
000000000001000100110011
0000000000010001001100111100
00000000000100010011001111000000
0���
最后一行(带有特殊字符的行)是上面主函数中的printf(binAddr)。从函数内部的printf语句可以清楚地看出,二进制代码被正确构造了。
再次说明,这取决于我在地址操作方面的无能。我做错了什么?

4
不想冒犯,但这里没有人会为你编写代码。这是一个让你变得更加熟练于C字符串操作和地址处理的好机会。尝试一下,有问题就问。 - linuxuser27
1个回答

3

使用查找表相当容易:

const char * const quads = { "0000", "0001", "0010", .... };

const char * hex_to_bin_quad(unsigned char c)
{
  if (c >= '0' && c <= '9') return quads[     c - '0'];
  if (c >= 'A' && c <= 'F') return quads[10 + c - 'A'];
  if (c >= 'a' && c <= 'f') return quads[10 + c - 'a'];
  return -1;
}

现在,迭代您的字符串并为每个字符附加 hex_to_bin_quad(c)(例如使用 strncat)。您已经知道需要一个长度为 4 * strlen(src) + 1 的目标字符串,因此请分配、迭代并连接。

你只是将循环条件错了一个。你可以这样说 for( ; *ptr; ++ptr) 并直接使用 *ptr - Kerrek SB
它虽然无法编译,但你是如何规避标量初始化警告/错误的? - Zimano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接