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