0

第一次在这里发帖。我有一个从十六进制转换为十进制的任务,包括其他转换,但这个让我很难过......

所以我需要转换的十六进制值是 12345678、2A3DF8A7、00FF00FF。00FF00FF 工作正常,这是给我带来麻烦的数值。

我知道你应该将数字乘以 16^n,但由于某种原因,即使我认为我做得对,我得到的值也太高了。显然不是,因为它不起作用。帮助将不胜感激!

我的代码在过去的一个小时里一直在改变,但这是最后一个“else”,这就是问题所在。

public void toDec()
{
    dec = 0;
    for (int j = 0, i = 7; j < hex.length(); j++){

        if (hex.charAt(j) == 'A') {
            dec += (10 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'B') {
            dec += (11 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'C') {
            dec += (12 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'D') {
            dec += (13 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'E') {
            dec += (14 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == 'F') {
            dec += (15 * (int)Math.pow(16, i));
        }
        else if (hex.charAt(j) == '0') {
            dec = dec;
        }
        else {
            dec += ((int)hex.charAt(j)) * ((int)Math.pow(16, i));
        }
        i--;
    }
}
4

2 回答 2

0

您的问题出在您的else子句中,处理数字 1 到 9。

问题是您将数字与代表它们的字符混淆了。例如,数字 1 由字符 表示'1',其字符代码为 49。因此,当您在 else 子句(即)中将'1'字符转换为时,您得到的是字符代码 49,而不是 1。int(int)hex.charAt(j)

现在,解决这个问题的简单(和惯用)方法是在你的角色上使用整数数学。例如,使用hex.charAt(j) - '0'代替(int)hex.charAt(j). 这是有效的,因为'0'通过的字符'9'被分配了连续的字符代码 48 到 57,因此(例如)从(49)'0'的字符代码中减去 (48) 的字符代码'1'会返回实际的数字值,因为49 - 48 = 1. 其他数字也一样:'5' - '0'等于53 - 48,(当然)等于 5。

更好的是,同样的方法也适用于您的其他十六进制字符!例如,如果您这样做'C' - 'A' + 10,您将得到结果12(即字母 C 的十六进制值)。

于 2013-09-13T01:01:52.030 回答
0

将 char 转换为 int 是这里的问题 - 你得到的是 char 代码,而不是表示特定数字的 int 值。试一试:System.out.println((int) '5');

解决这个问题的最简单方法是(hex.charAt(j) - '0').

于 2013-09-13T01:02:01.083 回答