【问题标题】:Creating ByteArray in Kotlin在 Kotlin 中创建 ByteArray
【发布时间】:2018-12-26 11:36:41
【问题描述】:

有没有比下面的版本更好/更短的方法从常量十六进制创建字节数组?

byteArrayOf(0xA1.toByte(), 0x2E.toByte(), 0x38.toByte(), 0xD4.toByte(), 0x89.toByte(), 0xC3.toByte())

我尝试将0xA1 不带.toByte(),但我收到语法错误 投诉说integer literal does not conform to the expected type Byte。输入整数很好,但我更喜欢十六进制形式,因为我的源是十六进​​制字符串。任何提示将不胜感激。谢谢!

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    作为一个选项,您可以创建简单的函数

    fun byteArrayOfInts(vararg ints: Int) = ByteArray(ints.size) { pos -> ints[pos].toByte() }
    

    并使用它

    val arr = byteArrayOfInts(0xA1, 0x2E, 0x38, 0xD4, 0x89, 0xC3)
    

    【讨论】:

      【解决方案2】:

      如果你所有的字节都小于或等于0x7F,你可以直接放:

      byteArrayOf(0x2E, 0x38)
      

      如果您需要使用大于0x7F 的字节,您可以使用无符号文字生成UByteArray,然后将其转换回ByteArray

      ubyteArrayOf(0xA1U, 0x2EU, 0x38U, 0xD4U, 0x89U, 0xC3U).toByteArray()
      

      我认为这比在每个元素上附加.toByte() 好多了,而且也不需要定义自定义函数。

      不过,Kotlin 的无符号类型是一项实验性功能,因此您可能会遇到一些警告问题。

      【讨论】:

        【解决方案3】:

        问题在于 Kotlin 中的字节是有符号的,这意味着它们只能表示 [-128, 127] 范围内的值。您可以像这样创建ByteArray 来测试它:

        val limits = byteArrayOf(-0x81, -0x80, -0x79, 0x00, 0x79, 0x80)
        

        只有第一个和最后一个值会产生错误,因为它们超出了有效范围 1。

        这与as in Java 的行为相同,如果您的值不适合Byte(或将它们偏移128 等),则解决方案可能是use a larger number type


        旁注:如果您打印使用 toInt 调用创建的数组的内容,您会看到大于 127 的值已翻转为负数:

        val bytes = byteArrayOf(0xA1.toByte(), 0x2E.toByte(), 0x38.toByte(), 0xD4.toByte(), 0x89.toByte(), 0xC3.toByte())
        println(bytes.joinToString()) // -95, 46, 56, -44, -119, -61
        

        【讨论】:

          猜你喜欢
          • 2020-02-17
          • 2017-10-19
          • 1970-01-01
          • 1970-01-01
          • 2011-11-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多