字符到整数转换为字母字符

时间:2013-02-04 02:13:56

标签: c

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

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

如果我一条一条地打印那条线,像“A2C9”这样的十六进制字符串,那么由于某种原因,我的A转换为17,我的C转换为19.但是数字2和9正确显示。我想弄清楚我是否在某处丢失了某些东西。

2 个答案:

答案 0 :(得分:2)

您正在减去ASCII值。这对于A-Z和0-9都很好,但如果你开始混合它们就不行。阅读有关ASCII表的信息,以便更好地理解该问题。

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

答案 1 :(得分:1)

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

当你计算'A' - '0'时,你会得到65 - 48 = 17,这就是你所看到的“七分之一”。

要将字母字符'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的代码是连续的,但不保证字母A-Z的代码是连续的。特别是,如果代码集是EBCDIC(主要但不仅仅用于IBM大型机),则字母的代码不是连续的。