C库函数用于将十六进制数字字符串转换为整数?

时间:2011-12-12 15:08:05

标签: c string hex glib

我有一个可变长度字符串,其中每个字符代表一个十六进制数字。我可以遍历字符并使用case语句将其转换为十六进制,但我觉得必须有一个标准的库函数来处理它。有没有这样的事情?

我想做的例子。 "17bf59c" - > int intarray[7] = { 1, 7, 0xb, 0xf, 5, 9, 0xc}

4 个答案:

答案 0 :(得分:3)

不,没有这样的功能,可能是因为(现在我猜测,我不是很长时间的C标准库架构师),它很容易从现有功能组合在一起。这是一种体面的做法:

int * string_to_int_array(const char *string, size_t length)
{
  int *out = malloc(length * sizeof *out);
  if(out != NULL)
  {
    size_t i;
    for(i = 0; i < length; i++)
    {
      const char here = tolower(string[i]);
      out[i] = (here <= '9') ? (here - '\0') : (10 + (here - 'a'));
    }
  }
  return out;
}

注意:以上内容未经测试。

还要注意可能不明显的事情,但仍然非常重要(在我看来):

  1. const用于由函数视为“只读”的指针参数。
  2. 请勿重复out指向的类型,使用sizeof *out
  3. 请勿在C中投射malloc()的返回值。
  4. 在使用内存之前检查malloc()是否成功。
  5. 不要硬编码ASCII值,使用字符常量。
  6. 以上仍假设编码,其中'a'..'f'是连续的,并且可能会破坏,例如EBCDIC。你有时会得到你付出的代价。 :)

答案 1 :(得分:2)

使用strtol

void to_int_array (int *dst, const char *hexs)
{
    char buf[2] = {0};
    char c;
    while ((c = *hexs++)) {
        buf[0] = c;
        *dst++ = strtol(buf,NULL,16);
    }
}

答案 2 :(得分:1)

这是另一个允许您传入输出数组的版本。大多数时候,你不需要malloc,而且价格昂贵。堆栈变量通常很好,你知道输出永远不会比输入大。你仍然可以传入一个已分配的数组,如果它太大,或者你需要将它传回来。

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

/* str of length len is parsed to individual ints into output
* length of output needs to be at least len.
* returns number of parsed elements. Maybe shorter if there
* are invalid characters in str.
*/
int string_to_array(const char *str, int *output)
{
    int *out = output;
    for (; *str; str++) {
        if (isxdigit(*str & 0xff)) {
            char ch = tolower(*str & 0xff);
            *out++ = (ch >= 'a' && ch <= 'z') ? ch - 'a' + 10 : ch - '0';
        }
    }
    return out - output;
}

int main(void)
{
    int values[10];
    int len = string_to_array("17bzzf59c", values);
    int i = 0;
    for (i = 0; i < len; i++) 
        printf("%x ", values[i]);
    printf("\n");
    return EXIT_SUCCESS;
}

答案 3 :(得分:1)

#include <stdio.h>

int main(){
    char data[] =  "17bf59c";
    const int len = sizeof(data)/sizeof(char)-1;
    int i,value[sizeof(data)/sizeof(char)-1];

    for(i=0;i<len;++i)
        sscanf(data+i, "%1x",value + i);

    for(i=0;i<len;++i)
        printf("0x%x\n", value[i]);
    return 0;
}