在C中将hex转换为二进制

可能重复:
使用sscanf将长hex字符串转换为int数组

我之前已经看过一些关于这方面的主题,但大多数解决方案都是用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 = '0' && ch = 'A' && 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语句可以清楚地看出二进制代码是正确构造的。

再一次,这归结于我对地址操纵没有任何价值。 我究竟做错了什么?

查找表非常简单:

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