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

时间:2011-11-20 22:31:22

标签: c binary hex

  

可能重复:
  Convert a long hex string in to int array with sscanf

之前我已经看过一些关于此问题的主题,但大多数解决方案都是用Python编写的(诅咒你很容易!)。

在C中有一种简单的方法吗?这就是我的解决方案所需要的。我知道它在概念上并不复杂,但我对C字符串操作和地址处理非常可怕。

感谢您的帮助,伙计们!

---------- EDIT -------------

好的,所以我解决了这个问题,我还有另外一个问题(我不想打开一个新线程!)。下面是我对给定代码的修改,包括函数调用和输出。

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语句中可以清楚地看出,正确构造了二进制代码。

再一次,这归结于我对地址操纵不值得。我做错了什么?

1 个答案:

答案 0 :(得分:4)

查找表非常简单:

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的目标字符串,因此需要分配,迭代和连接。