杰瑞科技汇

Java如何将十六进制转为十进制?

使用 Integer.parseInt() (最常用、最推荐)

这是最直接、最简洁的方法。Integer 类提供了一个静态方法 parseInt(),它可以接受一个字符串和基数(radix)作为参数,并将其转换为对应的整数。

语法: int decimalValue = Integer.parseInt(hexString, 16);

  • hexString: 表示十六进制值的字符串。注意:字符串不能包含 "0x" 或 "0X" 前缀,否则会抛出 NumberFormatException
  • `16**: 表示基数为16,即十六进制。

示例代码

public class HexToDecimal {
    public static void main(String[] args) {
        // 示例1: 标准的十六进制字符串
        String hexString1 = "1A3F";
        int decimal1 = Integer.parseInt(hexString1, 16);
        System.out.println("十六进制 '" + hexString1 + "' 转换为十进制是: " + decimal1); // 输出: 6719
        // 示例2: 包含小写字母的字符串
        String hexString2 = "ff"; // 等同于 255
        int decimal2 = Integer.parseInt(hexString2, 16);
        System.out.println("十六进制 '" + hexString2 + "' 转换为十进制是: " + decimal2); // 输出: 255
        // 示例3: 较大的数值
        String hexString3 = "7FFFFFFF"; // Integer.MAX_VALUE
        int decimal3 = Integer.parseInt(hexString3, 16);
        System.out.println("十六进制 '" + hexString3 + "' 转换为十进制是: " + decimal3); // 输出: 2147483647
        // 示例4: 如果字符串带有 "0x" 前缀,会抛出异常
        try {
            String hexStringWithPrefix = "0x1A3F";
            int decimal4 = Integer.parseInt(hexStringWithPrefix, 16);
            System.out.println(decimal4);
        } catch (NumberFormatException e) {
            System.out.println("错误: 字符串不能带有 '0x' 前缀。"); // 这行会被执行
        }
    }
}

使用 Long.parseLong() (用于处理大数)

如果你的十六进制数值可能超出 int 类型的范围(即大于 0x7FFFFFFF 或小于 0x80000000),你应该使用 Long.parseLong()

语法: long decimalValue = Long.parseLong(hexString, 16);


示例代码

public class HexToDecimalLong {
    public static void main(String[] args) {
        // 一个超出 int 范围的十六进制数
        String largeHexString = "FFFFFFFF"; // 等于 4294967295L
        // 如果用 int,会得到 -1 (因为溢出)
        int intValue = Integer.parseInt(largeHexString, 16);
        System.out.println("使用 int 转换的结果: " + intValue); // 输出: -1 (错误)
        // 使用 long 得到正确结果
        long longValue = Long.parseLong(largeHexString, 16);
        System.out.println("使用 long 转换的结果: " + longValue); // 输出: 4294967295 (正确)
    }
}

手动实现转换算法 (用于学习和面试)

为了更好地理解转换原理,你可以自己编写一个转换函数,这种方法的核心思想是遍历十六进制字符串的每一个字符,然后根据其权重(16的幂次方)进行累加。

转换原理: 十六进制数 1A3F 转换为十进制的计算过程如下: (1 * 16³) + (A * 16²) + (3 * 16¹) + (F * 16⁰) = (1 * 4096) + (10 * 256) + (3 * 16) + (15 * 1) = 4096 + 2560 + 48 + 15 = 6719


示例代码

public class HexToDecimalManual {
    public static void main(String[] args) {
        String hexString = "1A3F";
        int decimal = hexToDecimal(hexString);
        System.out.println("手动转换 '" + hexString + "' 为十进制: " + decimal); // 输出: 6719
    }
    public static int hexToDecimal(String hex) {
        // 检查输入是否为空
        if (hex == null || hex.isEmpty()) {
            return 0;
        }
        // 将字符串转换为大写,方便处理小写字母
        hex = hex.toUpperCase();
        int decimalValue = 0;
        int length = hex.length();
        // 遍历字符串的每一个字符
        for (int i = 0; i < length; i++) {
            char c = hex.charAt(i);
            int digitValue;
            // 将字符转换为对应的数值
            if (c >= '0' && c <= '9') {
                digitValue = c - '0';
            } else if (c >= 'A' && c <= 'F') {
                digitValue = 10 + (c - 'A');
            } else {
                // 如果包含非法字符,抛出异常
                throw new IllegalArgumentException("无效的十六进制字符: " + c);
            }
            // 计算权重并累加
            // power 是 16 的 (length - 1 - i) 次方
            int power = length - 1 - i;
            decimalValue += digitValue * Math.pow(16, power);
        }
        return decimalValue;
    }
}

总结与对比

方法 优点 缺点 适用场景
Integer.parseInt() 代码简洁、性能高、是官方推荐方式 仅能处理 int 范围内的值 绝大多数日常开发场景
Long.parseLong() 代码简洁,能处理更大的数值 仅能处理 long 范围内的值 处理可能超过 int 范围的十六进制数
手动实现 有助于理解底层原理,灵活性高 代码复杂,容易出错,性能较低 学习、面试、或有特殊转换需求时

最佳实践:

  • 优先使用 Integer.parseInt(hexString, 16) 这是最标准、最安全、最高效的方法。
  • 如果数值可能很大,不确定是否在 int 范围内,请使用 Long.parseLong(hexString, 16)
  • 在处理带有 "0x" 前缀的字符串时,可以先使用 String.substring(2) 去掉前缀再进行转换。
// 处理带 "0x" 前缀的字符串
String hexWithPrefix = "0x1A3F";
if (hexWithPrefix.startsWith("0x") || hexWithPrefix.startsWith("0X")) {
    hexWithPrefix = hexWithPrefix.substring(2);
}
int decimal = Integer.parseInt(hexWithPrefix, 16);
System.out.println(decimal); // 输出: 6719
分享:
扫描分享到社交APP
上一篇
下一篇