我正在将字符串逐个字符转换为整数。所以'A' - '0' 应该是 10。然而,即使数字很好,字母字符(即 AF)也会出现 7。例如,这是我的转换代码行:
result = result + (((int) (*new - '0')) * pow(16, bases));
如果我为像“A2C9”这样的十六进制字符串逐段打印该行,那么由于某种原因,我的 A 被转换为 17,而我的 C 被转换为 19。但是数字 2 和 9 输出正确。我想弄清楚我是否在某处遗漏了什么。
我正在将字符串逐个字符转换为整数。所以'A' - '0' 应该是 10。然而,即使数字很好,字母字符(即 AF)也会出现 7。例如,这是我的转换代码行:
result = result + (((int) (*new - '0')) * pow(16, bases));
如果我为像“A2C9”这样的十六进制字符串逐段打印该行,那么由于某种原因,我的 A 被转换为 17,而我的 C 被转换为 19。但是数字 2 和 9 输出正确。我想弄清楚我是否在某处遗漏了什么。
您正在减去 ASCII 值。这对 AZ 和 0-9 来说很好,但如果你开始混合它们就不行了。阅读 ASCII 表以更好地理解该问题。
'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 大型机),则字母的代码是不连续的。