从常量十六进制创建字节数组是否比下面的版本更好/更短?
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
。放置整数是可以的,但是我更喜欢使用十六进制形式,因为我的来源是十六进制字符串。任何提示将不胜感激。谢谢!
答案 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