【发布时间】:2019-05-31 02:56:01
【问题描述】:
如何将表示无符号长整数的Long/ULong 转换为带有填充零的无符号十六进制字符串(16 位十六进制字符串)?
我正在寻找一个使用 Kotlin 或 Java 的简单而整洁的解决方案。
【问题讨论】:
标签: java kotlin formatting number-formatting long-integer
如何将表示无符号长整数的Long/ULong 转换为带有填充零的无符号十六进制字符串(16 位十六进制字符串)?
我正在寻找一个使用 Kotlin 或 Java 的简单而整洁的解决方案。
【问题讨论】:
标签: java kotlin formatting number-formatting long-integer
val mutableList = listOf(121212L, 121212121212L,-1L)
mutableList.forEach {
println(it.toULong().toString(16).padStart(16, '0'))
}
它给了
000000000001d97c
0000001c38ce307c
ffffffffffffffff
已编辑:感谢 Ilya 在评论中缺少 toULong 部分。
【讨论】:
it.toULong().toString(16).padStart(16, '0')
String.format 找到的解决方案更长而且看起来更复杂,但它只运行了运行我的解决方案所需时间的大约 10%。这可能是因为解析格式字符串很慢。所以这确实是一个更好的答案。
我在String.format() 中使用x/X 找到了解决方案:
fun Long.to16DigitUnsignedLowercaseHexString() =
"%016x".format(this)
fun Long.to16DigitUnsignedUppercaseHexString() =
"%016X".format(this)
我已经测试它适用于边界值0L、1L、Long.MAX_VALUE、-1L 和Long.MIN_VALUE,所以应该没有问题。
java - How can I pad an integer with zeros on the left? - Stack Overflow 中提出了类似的问题。第一次看到这个时,我没想到它会起作用,因为我认为x/X 用于有符号的十六进制格式。原来我错了,x/X 正好是无符号十六进制格式。
【讨论】: