十六进制转换为二进制用C [英] Convert Hex to Binary in C

查看:123
本文介绍了十六进制转换为二进制用C的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

可能重复:结果
  <一href=\"http://stackoverflow.com/questions/8197838/convert-a-long-hex-string-in-to-int-array-with-sscanf\">Convert长十六进制字符串中int数组与sscanf的

我以前看过一些这方面的话题,但大多数解决方案是在Python(骂你是那么容易!)。

I have seen some topics on this before, but most solutions are in Python (curse you for being so easy!).

有一个简单的方法在C这样做吗?这是我的解决方案需要在。我知道这不是概念复杂,但我可怕的用C字符串操作和地址的处理。

Is there an easy way to do this in C? This is what my solution needs to be in. I know it's not complicated conceptually, but I am horrendous with C string manipulation and address handling.

感谢您的帮助,伙计们!

Thanks for the help, guys!

----------编辑-------------

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

好吧,让我解决了这个问题,我有一个问题(我不想开辟一个新线程!)。下面是我修改给定的code,用函数调用和输出。

Okay, so I solved that problem, and I have another question (I didn't want to open up a new thread!). Below is my modification to the given code, with the function call and the output.

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输入):

Here is the output (when input with 001133c0):

0000

00000000

000000000001

000000000001

0000000000010001

0000000000010001

00000000000100010011

00000000000100010011

000000000001000100110011

000000000001000100110011

0000000000010001001100111100

0000000000010001001100111100

00000000000100010011001111000000

00000000000100010011001111000000

最后一行(有特殊字符)是在上述主要功能的printf(binAddr)。它是从二进制code正在构建正确函数内部的printf的明确声明。

The last line (with the special characters) is the printf(binAddr) in the main function above. It is clear from the printf statements inside the function that the binary code is being constructed correctly.

再次,这可以归结为我不是值得任何与地址操作。我在做什么错了?

Once again, this comes down to me not being worth anything with address manipulation. What am I doing wrong?

推荐答案

这是一个查找表相​​当容易:

It's fairly easy with a lookup table:

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 ,所以分配,迭代并连接。

Now iterate over your string and append hex_to_bin_quad(c) for each character (e.g. using strncat). You already know that you'll need a target string of length 4 * strlen(src) + 1, so allocate, iterate and concatenate.

这篇关于十六进制转换为二进制用C的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆