1. 概述
本文将介绍在Java中将整数转换为十六进制的多种方法。我们将通过代码示例详细讨论每种实现方式,并分析其适用场景。
2. 整数转十六进制基础
在深入代码前,先理解转换原理:
- 整数使用十进制(基数为10),包含0-9的数字
- 十六进制使用16个符号表示,包含0-9和A-F
Java中实现转换主要有三种途径:
- 数学算法实现
- Java内置方法
- 第三方库
3. 原始算法实现
通过数学运算实现转换的核心步骤:
- 将整数除以16
- 对商继续除以16
- 将余数转换为十六进制字符
- 重复直到商为0
基于此算法实现转换器:
class IntegerToHex {
static final String digits = "0123456789ABCDEF";
static String integerToHex(int input) {
if (input <= 0)
return "0";
StringBuilder hex = new StringBuilder();
while (input > 0) {
int digit = input % 16;
hex.insert(0, digits.charAt(digit));
input = input / 16;
}
return hex.toString();
}
}
测试用例验证:
@Test
void givenIntegerValue_whenUseRawMethod_thenWillGetHexValue() {
String result = IntegerToHex.integerToHex(1055);
assertEquals("41F", result);
}
⚠️ 该方法仅支持正整数,负数会返回"0"
4. String.format()方法
使用String类的format()
方法,通过%x
格式化符实现转换:
@Test
void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValue() {
String result = String.format("%02x", 255);
assertEquals("ff", result);
}
✅ 可通过格式化符控制补零:
%02x
:2位十六进制(不足补零)%04x
:4位十六进制(不足补零)
@Test
void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValueWithLeftZeros() {
String result = String.format("%04x", 255);
assertEquals("00ff", result);
}
✅ 大小写控制:
%x
:小写输出%X
:大写输出
@Test
void givenIntegerPositiveValue_whenUseStringFormat_thenWillGetHexValueWithLeftZerosAndUpperLetter() {
String result = String.format("%04X", 255);
assertEquals("00FF", result);
}
5. toHexString()方法
Integer和Long类提供的静态方法toHexString()
:
- 底层调用
toUnsignedString()
- 自动处理为无符号值
- ⚠️ 不支持负数输入
Integer类使用示例:
@Test
void givenIntegerValue_whenUseIntegerToHexString_thenWillGetHexValue() {
String result = Integer.toHexString(1000);
assertEquals("3e8", result);
}
Long类使用示例:
@Test
void givenIntegerValue_whenUseLongToHexString_thenWillGetHexValue() {
String result = Long.toHexString(255L);
assertEquals("ff", result);
}
6. toString()方法
Integer和Long类的toString()
方法支持指定进制:
@Test
public void givenNegativeIntegerValue_whenUseIntegerToString_thenWillGetHexValue() {
String result = Integer.toString(-1458, 16);
assertEquals("-5b2", result);
}
✅ 支持有符号整数转换,这是与前两种方法的显著区别
Long类使用示例:
@Test
public void givenLongValue_whenUseLongToString_thenWillGetHexValue() {
String result = Long.toString(158, 16);
assertEquals("9e", result);
}
7. Apache Commons Codec库
使用第三方库实现转换,需先添加依赖:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
通过Hex.encodeHexString()
实现:
@Test
public void givenIntegerValue_whenUseApacheCommons_thenWillGetHexSignedValue() {
String result = Hex.encodeHexString(new byte[] { (byte) 254 });
assertEquals("fe", result);
}
⚠️ 该方法存在明显限制:
- 输入需为字节数组
- Java的byte类型范围:-128到127
- 仅适用于小于255的值
Java 17引入了
java.util.HexFormat
,提供类似功能但更现代化
8. 总结
本文系统介绍了Java中整数转十六进制的多种实现方式:
- 原始算法:适合理解原理,但功能有限
- String.format():灵活控制格式,推荐使用
- toHexString():简洁高效,但仅支持无符号数
- toString():支持有符号数转换
- 第三方库:特定场景下的补充方案
根据实际需求选择合适方法,可优化代码性能和可读性。所有示例代码可在GitHub仓库获取。