在Kotlin中创建ByteArray

时间:2018-07-18 13:54:52

标签: kotlin

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

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。放置整数是可以的,但是我更喜欢使用十六进制形式,因为我的来源是十六进​​制字符串。任何提示将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:7)

作为一种选择,您可以创建简单的功能

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

并使用它

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

答案 1 :(得分:4)

如果您的所有字节均小于或等于0x7F,则可以将其直接放置:

byteArrayOf(0x2E, 0x38)

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

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

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

但是,Kotlin的无符号类型是实验性功能,因此警告可能会有些麻烦。

答案 2 :(得分: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