将十六进制数字字符串转换为整数

时间:2012-11-26 16:32:18

标签: c

我正在尝试实现htoi(s)[Dennis Ritchie chapter2 exercise 2-3 Q],它将一串十六进制数字转换为等效整数,任何人都可以帮助我解决这个程序的逻辑,我不需要代码,我只需要实现它的逻辑。我无法得到正确的逻辑

3 个答案:

答案 0 :(得分:1)

让我们退后一步:

如何实现一个接受单个十六进制数字并返回十进制等效数的函数?

换句话说,你会怎么写这个函数:

unsigned int hextodec(char c)
{
    ... your code here
}

提示:对于十进制数字,计算c -'0'时会发生什么?

一旦你有这个功能,使用它来计算更长的十六进制字符串的转换应该相当容易。

提示:0xF为15,0x10为16

答案 1 :(得分:0)

使用基数为16的strtol功能。

关于这种方式:

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

int xstrtol16(const char *s)
{
    errno = 0;
    char *endp = NULL;
    int result = strtol(s, &endp, 16);

    if (*charp || errno) {
       fprintf(stderr, "Failed to convert...\n");
       exit(1);
    }

    return result;
}

答案 2 :(得分:0)

考虑一下可打印的数字(在任何基数中)。基本上是表示简单数值(0 ... base-1)的符号列表,以及它们的数字位置的相关“权重”。对于十进制,符号为“0123456789”,权重为1,10,100,1000 ......

您可以通过查找每个符号的相应数值,将其乘以该数字位置的权重,并将这些产品汇总在一起,将可打印数字转换为“整数”。有效地做到这一点有一些技巧,但是直接的“愚蠢”实施可以很好地完成工作。

十六进制有点复杂,因为有两行符号 - 0-9和A-F - 并且有时希望接受大写和小写字母。处理这个问题还有一些技巧,但是以直接的方式进行(将每个角色与每次运行的极限进行比较并确定它适合哪一个)完全没问题(并且比其他方法更通用)。您甚至可以使用索引操作,只需将字符的索引找到“0123456789ABCDEF” - 效率低但很简单。