如何在Kotlin中将ByteArray转换为ShortArray?

Bre*_*loy 3 arrays kotlin

如果我的格式正确ByteArray(例如byteArrayOf(12, 0, 24, 0)),将其转换为的最简单方法是ShortArray什么?

为简单起见,除非字节序处理也很容易,否则假定为低字节序。

结果ShortArray应为(12, 24)

hot*_*key 5

您可以使用将其ByteArray作为列表处理.chunked(),尽管您必须手动将两个字节转换为Short

val bytes = byteArrayOf(12, 0, 24, 0)
val shorts = bytes
    .asList()
    .chunked(2)
    .map { (l, h) -> (l.toInt() + h.shl(8)).toShort() }
    .toShortArray()
Run Code Online (Sandbox Code Playgroud)


Ken*_*Ken 3

我不确定为什么,但似乎 Kotlin 将字节视为已签名的字节,并且上述答案仅在每对的第一个字节 < 127 时才有效。

例如(编辑以上内容以返回正确答案):

    val byteArray = byteArrayOf(211.toByte(), 0, 24, 0)
    val shortArray = ShortArray(byteArray.size / 2) {
        (byteArray[it * 2].toUByte().toInt() + (byteArray[(it * 2) + 1].toInt() shl 8)).toShort()
    }
    println(shortArray.toList()) // [211, 24]
Run Code Online (Sandbox Code Playgroud)

使用具有相同值的上述代码会返回错误信息,如 [-45, 24]