【问题标题】:Convert Hex to Binary in C [duplicate]在C中将十六进制转换为二进制[重复]
【发布时间】:2012-01-02 13:37:08
【问题描述】:

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

我以前看过一些关于此的主题,但大多数解决方案都是用 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...

最后一行(带有特殊字符)是上面 main 函数中的 printf(binAddr)。从函数内部的 printf 语句可以清楚地看出,二进制代码的构造是正确的。

再一次,这归结为我在地址操纵方面一文不值。我做错了什么?

【问题讨论】:

  • 别傻了,但这里可能没有人会为您编写此代码。这是一个让您变得不那么“可怕的 C 字符串操作和地址处理”的好机会。试一试并提出问题。

标签: c binary hex


【解决方案1】:

使用查找表相当容易:

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 的目标字符串,所以分配、迭代和连接。

【讨论】:

  • 啊,有道理!感谢您的帮助!
  • @user1056878:没问题。如果答案有用,请随意点击“接受”按钮:-)
  • 您刚刚将循环条件减一。你可以说for( ; *ptr; ++ptr),直接使用*ptr
  • 它无法编译,你是如何规避标量初始化器警告/错误的?
猜你喜欢
  • 2019-03-24
  • 2012-06-26
  • 2017-12-30
  • 2017-03-19
  • 2014-06-25
  • 2016-08-28
  • 2013-07-25
相关资源
最近更新 更多