在Kotlin中如何将ByteArray转换为ShortArray?附小端序示例
在Kotlin中将ByteArray转换为ShortArray的最简方法
针对你提出的需求——把格式规范的ByteArray(比如示例byteArrayOf(12, 0, 24, 0))转换为小端序的ShortArray(预期结果[12, 24]),这里有两种简洁易用的实现方式:
方法一:利用ByteBuffer(推荐,处理大小端更灵活)
Java NIO的ByteBuffer工具类在Kotlin中可以直接使用,它能帮我们自动处理字节分组和大小端序,代码非常简洁:
val inputBytes = byteArrayOf(12, 0, 24, 0) val resultShorts = ByteBuffer.wrap(inputBytes) .order(ByteOrder.LITTLE_ENDIAN) // 明确指定小端序 .asShortBuffer() .let { shortBuf -> ShortArray(shortBuf.remaining()).apply { shortBuf.get(this) } } // 此时resultShorts的值就是 [12, 24]
这个方法的优点是不需要手动处理字节偏移和符号问题,而且只需要修改ByteOrder.BIG_ENDIAN就能快速切换到大端序处理。
方法二:手动循环转换(轻量,无需依赖NIO)
如果你的ByteArray长度确定是偶数(像示例这样),也可以直接通过循环手动计算,代码同样简洁,而且更轻量:
val inputBytes = byteArrayOf(12, 0, 24, 0) val resultShorts = ShortArray(inputBytes.size / 2) { index -> // 小端序规则:第2*index位是低字节,2*index+1位是高字节 ((inputBytes[2 * index + 1].toInt() shl 8) or (inputBytes[2 * index].toInt() and 0xFF)).toShort() }
这里需要注意:Kotlin的Byte是有符号类型,所以转成Int时要和0xFF做与运算,避免符号扩展导致错误结果。如果需要切换到大端序,只需要交换两个字节的位置即可:
// 大端序的转换逻辑 ((inputBytes[2 * index].toInt() shl 8) or (inputBytes[2 * index + 1].toInt() and 0xFF)).toShort()
内容的提问来源于stack exchange,提问作者user5545202
相关产品推荐
相关产品推荐

