jamiechoo

 

kotlin把一个32位的数组转成字节数组, 再把字节数组转换成32位的数组,kotlin数据类型转换的方法

在 Kotlin 中,可以通过字节数组和 32 位整数(Int)数组之间的转换方法,完成数据类型的双向映射。以下是实现步骤和相关的所有数据类型转换方法。


将 32 位整数数组转换为字节数组

32 位整数(Int)占用 4 个字节,因此将 IntArray 转换为 ByteArray 时,需要对每个整数分解成 4 个字节。

代码示例

fun intArrayToByteArray(intArray: IntArray): ByteArray {
  return ByteArray(intArray.size * 4).apply {
    intArray.forEachIndexed { index, value -> val
    offset = index * 4
    this[offset] = (value shr 24).toByte()
    this[offset + 1] = (value shr 16).toByte()
    this[offset + 2] = (value shr 8).toByte()
    this[offset + 3] = value.toByte()
      }
     }
  }

将字节数组转换为 32 位整数数组

字节数组中的每 4 个字节可以重新组装为一个 32 位整数(Int)。

代码示例

fun byteArrayToIntArray(byteArray: ByteArray): IntArray {
    require(byteArray.size % 4 == 0) { "Byte array size must be a multiple of 4" }
    return IntArray(byteArray.size / 4).apply {
      for (i in this.indices) {
        val offset = i * 4
        this[i] = (byteArray[offset].toInt() shl 24) or
              ((byteArray[offset + 1].toInt() and 0xFF) shl 16) or
              ((byteArray[offset + 2].toInt() and 0xFF) shl 8) or
              (byteArray[offset + 3].toInt() and 0xFF)
          }
        }
      }

完整测试代码

fun main() {
  val originalIntArray = intArrayOf(12345678, -87654321, 0xFFFFFFFF.toInt(), 0)
    println("Original Int Array: ${originalIntArray.joinToString()}")
  val byteArray = intArrayToByteArray(originalIntArray)
    println("Converted to Byte Array: ${byteArray.joinToString { "%02x".format(it) }}")
  val convertedIntArray = byteArrayToIntArray(byteArray)
    println("Converted back to Int Array: ${convertedIntArray.joinToString()}")
  }

Kotlin 数据类型转换的方法

以下是 Kotlin 中常用数据类型转换的全面说明:

1. 数字类型之间的转换

Kotlin 提供了以下转换方法,所有数字类型都可以互相转换:

  • 整数类型转换

    • toByte(): 转换为 Byte
    • toShort(): 转换为 Short
    • toInt(): 转换为 Int
    • toLong(): 转换为 Long
  • 浮点类型转换

    • toFloat(): 转换为 Float
    • toDouble(): 转换为 Double
  • 字符转换

    • toChar(): 转换为 Char,适用于数字表示的字符。

2. 数组类型之间的转换

通过内置扩展函数,可以将一个类型的数组转换为另一种类型的数组:

  • toByteArray(): 将 IntArray, ShortArray, LongArray 等转换为 ByteArray
  • toIntArray(): 将 ByteArray, ShortArray, LongArray 等转换为 IntArray
  • 其他方法类似,例如 toShortArray(), toLongArray()

3. 字符串与字节数组之间的转换

  • 字符串转字节数组

     
    val str = "Hello, Kotlin"
    val byteArray = str.toByteArray() // 默认 UTF-8 编码
  • 字节数组转字符串

    val byteArray = byteArrayOf(72, 101, 108, 108, 111)
    val str = byteArray.toString(Charsets.UTF_8) // 使用 UTF-8 解码

4. 数组与列表的互相转换

  • 数组转列表:toList()
  • 列表转数组:toTypedArray()toIntArray() 等类型特定方法。

示例应用场景

  1. 保存大数据到文件
    • IntArray 转换为 ByteArray 后保存到文件,节省空间。
  2. 网络传输
    • 网络传输通常使用字节流,ByteArray 是通用数据结构。
  3. 二进制数据解析
    • 例如处理图像、音频文件时,经常需要字节数组和整数数组的互相转换。

注意事项

  1. 确保输入长度是转换单位的倍数(如 ByteArray 的长度为 4 的倍数时,才能转换为 IntArray)。
  2. 使用 & 0xFF 避免符号扩展对转换结果的影响。

posted on 2024-11-28 20:07  jamiechoo  阅读(163)  评论(0)    收藏  举报

导航