如何将 Int 转换为 ByteArray,然后使用 Kotlin 将其转换回 Int?

Posted

技术标签:

【中文标题】如何将 Int 转换为 ByteArray,然后使用 Kotlin 将其转换回 Int?【英文标题】:How can I convert an Int to a ByteArray and then convert it back to an Int with Kotlin? 【发布时间】:2021-07-14 16:03:39 【问题描述】:

这是我的代码:

Int -> ByteArray

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,76832,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***

你知道我哪里出错了吗?

【问题讨论】:

您可以使用 Java 的 ByteBuffer ,如下所述:***.com/questions/4485128/… 【参考方案1】:

这是解决方案。

Int -> ByteArray

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)

【讨论】:

我不确定它是否正确,我还没有尝试过,但我会在尝试之前竖起大拇指,因为你是第一个这样做的人,我一直在寻找一个完整的答案:0 @MohammadElsayed 是正确的。我在各个方面都对其进行了测试。 :) 但如果没有,请告诉我。 我写了for (i in 0..3) buffer[offset + i] = (data shr (i*8)).toByte()【参考方案2】:

这是一个会给你一个字节数组的衬里:

fun numberToByteArray (data: Number, size: Int = 4) : ByteArray = 
    ByteArray (size) i -> (data.toLong() shr (i*8)).toByte()

可选择设置字节数(大小),可以转换 Shorts、Ints、Longs。

只要这样称呼它:

var yourByteArray = numberToByteArray (yourNumberHere)

【讨论】:

“item.toLong()”应该是“data.toLong()”吗? @Awesomeness,是的。!固定。 该死,Kotlin 没有用于将类型转换为字节的内置类,例如 C# 的 BitConverter 已经存在了 2 年,我必须为每种类型创建这些方法?这是出乎意料的......我认为这是一个非常基本的需求。

以上是关于如何将 Int 转换为 ByteArray,然后使用 Kotlin 将其转换回 Int?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 bytearray 转换为 image 或 image 转换为 bytearray ?

如何将 protobuf 对象转换为 ByteArray 并在 Swift 中使用 Base64 URL_SAFE 进行编码?

在python中将bytearray转换为short int

Kotlin Native 如何将 ByteArray 转换为 String?

如何将 bytearray 转换为 img 标签?

如何将 Kotlin ByteArray 转换为 NsData,反之亦然