1

我正在将字符串逐个字符转换为整数。所以'A' - '0' 应该是 10。然而,即使数字很好,字母字符(即 AF)也会出现 7。例如,这是我的转换代码行:

result = result + (((int) (*new - '0')) * pow(16, bases));

如果我为像“A2C9”这样的十六进制字符串逐段打印该行,那么由于某种原因,我的 A 被转换为 17,而我的 C 被转换为 19。但是数字 2 和 9 输出正确。我想弄清楚我是否在某处遗漏了什么。

4

2 回答 2

2

您正在减去 ASCII 值。这对 AZ 和 0-9 来说很好,但如果你开始混合它们就不行了。阅读 ASCII 表以更好地理解该问题。

这是表格: http ://www.asciitable.com/index/asciifull.gif

于 2013-02-04T02:17:35.517 回答
1

'A' 的 ASCII 码是 65;'Z' 是 90。'0' 的 ASCII 码是 48;对于“9”,它是 57。这些代码也用于 Unicode (UTF-8)、8859-x 和许多其他代码集。

当您计算 时'A' - '0',您会得到 65 - 48 = 17,这是您所看到的 'off-by-7'。

要将字母字符 'A' 转换为 'F' 到它们的十六进制等价物,您需要一些变化:

c - 'A' + 10;

记住 'a' 到 'f' 也是允许的,对于他们你需要:

c - 'a' + 10;

或者您需要先转换为大写。或者您可以使用:

const char hexdigits[] = "0123456789ABCDEF";

int digit = strchr(hexdigits, toupper(c)) - hexdigits;

或无数其他技术中的任何一种。最后一个片段假定c已知包含有效的十六进制数字。如果不是这种情况,它会非常失败。

请注意,C 确实保证数字 0-9 的代码是连续的,但不保证字母 AZ 的代码是连续的。特别是,如果代码集是 EBCDIC(主要但不只用于 IBM 大型机),则字母的代码是不连续的。

于 2013-02-04T02:21:10.090 回答