之前我已经看过一些关于此问题的主题,但大多数解决方案都是用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语句中可以清楚地看出,正确构造了二进制代码。
再一次,这归结于我对地址操纵不值得。我做错了什么?
答案 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
的目标字符串,因此需要分配,迭代和连接。