我将字符串逐个字符转换为整数。所以'A' - '0'应该是10.然而即使数字很好,字母字符(即A-F)也会被7关闭。例如,这是我的转换代码行:
result = result + (((int) (*new - '0')) * pow(16, bases));
如果我一条一条地打印那条线,像“A2C9”这样的十六进制字符串,那么由于某种原因,我的A转换为17,我的C转换为19.但是数字2和9正确显示。我想弄清楚我是否在某处丢失了某些东西。
答案 0 :(得分:2)
您正在减去ASCII值。这对于A-Z和0-9都很好,但如果你开始混合它们就不行。阅读有关ASCII表的信息,以便更好地理解该问题。
答案 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大型机),则字母的代码不是连续的。