1. 概述
在实际开发中,我们有时需要将整数(Int)转换为其对应的十六进制字符串(Hex String)。本文将介绍几种在 Kotlin 中实现该功能的方法,适用于不同场景下的需求,包括标准库函数、扩展函数、格式化方法等。
2. 使用 Integer.toHexString()
这是 Java 标准库提供的方法,Kotlin 也可以直接使用:
val hex = Integer.toHexString(4001)
assertEquals("fa1", hex)
如上所示,toHexString()
方法可以很方便地将整数转换为小写的十六进制字符串。⚠️需要注意的是,这个方法在处理负数时会自动将其转换为无符号形式,返回的是 32 位无符号整数的十六进制表示。
例如:
val hex = Integer.toHexString(-1)
assertEquals("ffffffff", hex)
3. 使用 toString(radix: Int)
扩展函数
从 Kotlin 1.1 开始,我们可以使用 toString()
扩展函数并指定基数(radix)来转换进制:
val number = 4001
assertEquals("fa1", number.toString(16))
这种方式更 Kotlin 风格,但要注意:它不会自动将负数转为无符号形式。因此,对于负数,toString(16)
和 Integer.toHexString()
的结果会不一致:
val number = -100
assertNotEquals(Integer.toHexString(number), number.toString(16)) // true
3.1 解决负数转换不一致的问题
要让 toString(16)
的行为与 Integer.toHexString()
一致,我们需要先将整数转换为无符号类型。Kotlin 1.3 引入了无符号整数类型,可以这样处理:
assertEquals(Integer.toHexString(number), number.toUInt().toString(16))
如果 toUInt()
不可用(比如在旧版本或某些平台),也可以通过位运算实现:
val unsignedLong = number.toLong() and 0xffffffffL
assertEquals(Integer.toHexString(number), unsignedLong.toString(16))
✅ 推荐做法:优先使用 toUInt().toString(16)
,简洁清晰。
4. 使用格式化字符串 format("%x")
Kotlin 提供了字符串格式化方法,我们也可以用 %x
来输出十六进制:
val number = 4001
assertEquals("fa1", "%x".format(number))
%x
表示输出小写十六进制- 如果需要大写,可以使用
%X
,例如:
assertEquals("FA1", "%X".format(4001))
⚠️注意:和 toString(16)
一样,format()
也不会自动处理负数的无符号转换。
5. 总结
方法 | 是否处理负数无符号 | 是否 Kotlin 风格 | 推荐程度 |
---|---|---|---|
Integer.toHexString() |
✅ 是 | ❌ 否(Java 风格) | ⭐⭐⭐⭐ |
toString(16) |
❌ 否 | ✅ 是 | ⭐⭐⭐ |
toUInt().toString(16) |
✅ 是 | ✅ 是 | ⭐⭐⭐⭐⭐ |
format("%x") |
❌ 否 | ✅ 是 | ⭐⭐⭐ |
✅ 推荐用法:
- 普通正数:
toString(16)
或format("%x")
- 负数或需要无符号:
toUInt().toString(16)
或Integer.toHexString()
所有示例代码都可以在 GitHub 仓库 中找到。