使用 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 