如何使用 Kotlin 将 Int 转换为 ByteArray,然后将其转换回 Int?
How can I convert an Int to a ByteArray and then convert it back to an Int with Kotlin?
这是我的代码:
整数 -> 字节数组
private fun write4BytesToBuffer(buffer: ByteArray, offset: Int, data: Int) {
buffer[offset + 0] = (data shr 24).toByte()
buffer[offset + 1] = (data shr 16).toByte()
buffer[offset + 2] = (data shr 8).toByte()
buffer[offset + 3] = (data shr 0).toByte()
}
ByteArray -> Int
private fun read4BytesFromBuffer(buffer: ByteArray, offset: Int): Int {
return (buffer[offset + 0].toInt() shl 24) or
(buffer[offset + 1].toInt() shl 16) or
(buffer[offset + 2].toInt() shl 8) or
(buffer[offset + 3].toInt() and 0xff)
}
对于 -32,768 和 32,767 之间的任何值,它都可以正常工作。
但是,它不适用于更大的值。例如:
val buffer = ByteArray(10)
write4BytesToBuffer(buffer, 0, 324)
read4BytesFromBuffer(buffer, 0) // It returns 324 ***OK***
val buffer = ByteArray(10)
write4BytesToBuffer(buffer, 0, 40171)
read4BytesFromBuffer(buffer, 0) // It returns -25365 ***ERROR***
你看到我错在哪里了吗?
这是解决方案。
整数 -> 字节数组
private fun write4BytesToBuffer(buffer: ByteArray, offset: Int, data: Int) {
buffer[offset + 0] = (data shr 0).toByte()
buffer[offset + 1] = (data shr 8).toByte()
buffer[offset + 2] = (data shr 16).toByte()
buffer[offset + 3] = (data shr 24).toByte()
}
或更短的方式
for (i in 0..3) buffer[offset + i] = (data shr (i*8)).toByte()
ByteArray -> Int
private fun read4BytesFromBuffer(buffer: ByteArray, offset: Int): Int {
return (buffer[offset + 3].toInt() shl 24) or
(buffer[offset + 2].toInt() and 0xff shl 16) or
(buffer[offset + 1].toInt() and 0xff shl 8) or
(buffer[offset + 0].toInt() and 0xff)
}
这是一个可以为您提供 ByteArray 的单行代码:
fun numberToByteArray (data: Number, size: Int = 4) : ByteArray =
ByteArray (size) {i -> (data.toLong() shr (i*8)).toByte()}
可选择设置字节数(大小),可以转换 Shorts、Ints、Longs。
就这样称呼它:
var yourByteArray = numberToByteArray (yourNumberHere)
我会用 java.nio.ByteBuffer -
fun intToBytes(i: Int): ByteArray =
ByteBuffer.allocate(Int.SIZE_BYTES).putInt(i).array()
fun bytesToInt(bytes: ByteArray): Int =
ByteBuffer.wrap(bytes).int
这是我的代码:
整数 -> 字节数组
private fun write4BytesToBuffer(buffer: ByteArray, offset: Int, data: Int) {
buffer[offset + 0] = (data shr 24).toByte()
buffer[offset + 1] = (data shr 16).toByte()
buffer[offset + 2] = (data shr 8).toByte()
buffer[offset + 3] = (data shr 0).toByte()
}
ByteArray -> Int
private fun read4BytesFromBuffer(buffer: ByteArray, offset: Int): Int {
return (buffer[offset + 0].toInt() shl 24) or
(buffer[offset + 1].toInt() shl 16) or
(buffer[offset + 2].toInt() shl 8) or
(buffer[offset + 3].toInt() and 0xff)
}
对于 -32,768 和 32,767 之间的任何值,它都可以正常工作。 但是,它不适用于更大的值。例如:
val buffer = ByteArray(10)
write4BytesToBuffer(buffer, 0, 324)
read4BytesFromBuffer(buffer, 0) // It returns 324 ***OK***
val buffer = ByteArray(10)
write4BytesToBuffer(buffer, 0, 40171)
read4BytesFromBuffer(buffer, 0) // It returns -25365 ***ERROR***
你看到我错在哪里了吗?
这是解决方案。
整数 -> 字节数组
private fun write4BytesToBuffer(buffer: ByteArray, offset: Int, data: Int) {
buffer[offset + 0] = (data shr 0).toByte()
buffer[offset + 1] = (data shr 8).toByte()
buffer[offset + 2] = (data shr 16).toByte()
buffer[offset + 3] = (data shr 24).toByte()
}
或更短的方式
for (i in 0..3) buffer[offset + i] = (data shr (i*8)).toByte()
ByteArray -> Int
private fun read4BytesFromBuffer(buffer: ByteArray, offset: Int): Int {
return (buffer[offset + 3].toInt() shl 24) or
(buffer[offset + 2].toInt() and 0xff shl 16) or
(buffer[offset + 1].toInt() and 0xff shl 8) or
(buffer[offset + 0].toInt() and 0xff)
}
这是一个可以为您提供 ByteArray 的单行代码:
fun numberToByteArray (data: Number, size: Int = 4) : ByteArray =
ByteArray (size) {i -> (data.toLong() shr (i*8)).toByte()}
可选择设置字节数(大小),可以转换 Shorts、Ints、Longs。
就这样称呼它:
var yourByteArray = numberToByteArray (yourNumberHere)
我会用 java.nio.ByteBuffer -
fun intToBytes(i: Int): ByteArray =
ByteBuffer.allocate(Int.SIZE_BYTES).putInt(i).array()
fun bytesToInt(bytes: ByteArray): Int =
ByteBuffer.wrap(bytes).int