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 仓库 中找到。


原始标题:Convert Int to Hex String in Kotlin