如何在Kotlin中正确处理大于127的字节值?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Kotlin中正确处理大于127的字节值?相关的知识,希望对你有一定的参考价值。
想象一下,我有一个带有b
类型的变量Byte
的Kotlin程序,外部系统写入的值大于127
。 “外部”意味着我无法更改它返回的值的类型。
val a:Int = 128
val b:Byte = a.toByte()
a.toByte()
和b.toInt()
都返回-128
。
想象一下,我想从变量128
中获取正确的值(b
)。我该怎么做?
换句话说:magicallyExtractRightValue
的哪些实现会使以下测试运行?
@Test
fun testByteConversion() {
val a:Int = 128
val b:Byte = a.toByte()
System.out.println(a.toByte())
System.out.println(b.toInt())
val c:Int = magicallyExtractRightValue(b)
Assertions.assertThat(c).isEqualTo(128)
}
private fun magicallyExtractRightValue(b: Byte): Int {
throw UnsupportedOperationException("not implemented")
}
更新1:Thilo建议的解决方案似乎有效。
private fun magicallyExtractRightValue(o: Byte): Int = when {
(o.toInt() < 0) -> 255 + o.toInt() + 1
else -> o.toInt()
}
答案
使用Kotlin 1.3+,您可以使用unsigned types。例如toUByte
(Kotlin Playground):
private fun magicallyExtractRightValue(b: Byte): Int {
return b.toUByte().toInt()
}
甚至要求直接使用UByte
而不是Byte
(Kotlin Playground):
private fun magicallyExtractRightValue(b: UByte): Int {
return b.toInt()
}
对于Kotlin 1.3之前的版本,我建议使用extension function创建一个and
:
fun Byte.toPositiveInt() = toInt() and 0xFF
用法示例:
val a: List<Int> = listOf(0, 1, 63, 127, 128, 244, 255)
println("from ints: $a")
val b: List<Byte> = a.map(Int::toByte)
println("to bytes: $b")
val c: List<Int> = b.map(Byte::toPositiveInt)
println("to positive ints: $c")
示例输出:
from ints: [0, 1, 63, 127, 128, 244, 255]
to bytes: [0, 1, 63, 127, -128, -12, -1]
to positive ints: [0, 1, 63, 127, 128, 244, 255]
另一答案
好老printf
做我们想要的:
java.lang.String.format("%02x", byte)
以上是关于如何在Kotlin中正确处理大于127的字节值?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Gradle 项目中 Kotlin 的字节码版本设置为 Java 8?
如何在 C# 或 Linq 中比较大于或小于运算符值的两个字节数组?