在 Kotlin 中,将 Long 转换为 uint32 ByteArray 并将 Int 转换为 uint8 的最简洁方法是什么?
In Kotlin, whats the cleanest way to convert a Long to uint32 ByteArray and an Int to uint8?
fun longToByteArray(value: Long): ByteArray {
val bytes = ByteArray(8)
ByteBuffer.wrap(bytes).putLong(value)
return Arrays.copyOfRange(bytes, 4, 8)
}
fun intToUInt8(value: Int): ByteArray {
val bytes = ByteArray(4)
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).putInt(value and 0xff)
var array = Arrays.copyOfRange(bytes, 0, 1)
return array
}
我认为这些是一些 Java 方法在 Kotlin 中的等价物,但我想知道这些方法在 Kotlin 中是否 correct/necessary。
编辑:修复每个评论的示例,同时演示更改字节顺序。感谢您的反馈。我将接受演示如何在没有 ByteBuffer 的情况下执行此操作的答案。
我不想使用 ByteBuffer
,因为它会增加对 JVM 的依赖。相反,我使用:
fun longToUInt32ByteArray(value: Long): ByteArray {
val bytes = ByteArray(4)
bytes[3] = (value and 0xFFFF).toByte()
bytes[2] = ((value ushr 8) and 0xFFFF).toByte()
bytes[1] = ((value ushr 16) and 0xFFFF).toByte()
bytes[0] = ((value ushr 24) and 0xFFFF).toByte()
return bytes
}
fun longToByteArray(value: Long): ByteArray {
val bytes = ByteArray(8)
ByteBuffer.wrap(bytes).putLong(value)
return Arrays.copyOfRange(bytes, 4, 8)
}
fun intToUInt8(value: Int): ByteArray {
val bytes = ByteArray(4)
ByteBuffer.wrap(bytes).order(ByteOrder.LITTLE_ENDIAN).putInt(value and 0xff)
var array = Arrays.copyOfRange(bytes, 0, 1)
return array
}
我认为这些是一些 Java 方法在 Kotlin 中的等价物,但我想知道这些方法在 Kotlin 中是否 correct/necessary。
编辑:修复每个评论的示例,同时演示更改字节顺序。感谢您的反馈。我将接受演示如何在没有 ByteBuffer 的情况下执行此操作的答案。
我不想使用 ByteBuffer
,因为它会增加对 JVM 的依赖。相反,我使用:
fun longToUInt32ByteArray(value: Long): ByteArray {
val bytes = ByteArray(4)
bytes[3] = (value and 0xFFFF).toByte()
bytes[2] = ((value ushr 8) and 0xFFFF).toByte()
bytes[1] = ((value ushr 16) and 0xFFFF).toByte()
bytes[0] = ((value ushr 24) and 0xFFFF).toByte()
return bytes
}