如何从Kotlin JVM中的字节数组中获取无符号整数?

时间:2018-12-26 07:46:00

标签: arrays kotlin jvm byte unsigned-integer

Kotlin 1.3引入了unsigned integer types,但我似乎无法弄清楚如何从Kotlin JVM中的ByteArray获取无符号整数。

Kotlin本机具有便捷的ByteArray.getUIntAt()方法,但是对于Kotlin JVM而言不存在。

val bytes: ByteArray = byteArrayOf(1, 1, 1, 1)
val uint: UInt // = ???

在这里我有什么选择?有没有比使用ByteBuffer或从中移出方式更优雅的方式?

1 个答案:

答案 0 :(得分:4)

如评论中所述,JVM版本的Kotlin中没有开箱即用的解决方案。与Kotlin / Native函数相同的扩展函数可能看起来像这样:

fun ByteArray.getUIntAt(idx: Int) =
    ((this[idx].toUInt() and 0xFFu) shl 24) or
            ((this[idx + 1].toUInt() and 0xFFu) shl 16) or
            ((this[idx + 2].toUInt() and 0xFFu) shl 8) or
            (this[idx + 3].toUInt() and 0xFFu)

fun main(args: Array<String>) {

    // 16843009
    println(byteArrayOf(1, 1, 1, 1).getUIntAt(0))

    // 4294967295, which is UInt.MAX_VALUE
    println(byteArrayOf(-1, -1, -1, -1).getUIntAt(0))
}