Android 混合类型的Kotlin ByteArray
我需要在Kotlin中创建一个混合类型的字节数组 具体来说,我需要写一些东西,比如:Android 混合类型的Kotlin ByteArray,android,kotlin,bluetooth-lowenergy,Android,Kotlin,Bluetooth Lowenergy,我需要在Kotlin中创建一个混合类型的字节数组 具体来说,我需要写一些东西,比如: 0, 1, 0x02, 1, "me@emailaddr.com" 使用Kotlin将特性转换为布尔 很明显,我是科特林的新手。在Swift中使用的便捷方法在Kotlin中似乎没有类似的功能 我试过: data class BlePayload(val protoVer: Int, val transId: Int, val cmdType: Int, val valueType: Int, val val
0, 1, 0x02, 1, "me@emailaddr.com"
使用Kotlin将特性转换为布尔
很明显,我是科特林的新手。在Swift中使用的便捷方法在Kotlin中似乎没有类似的功能
我试过:
data class BlePayload(val protoVer: Int, val transId: Int, val cmdType: Int, val valueType: Int, val value: String)
fun packagePayload(): BlePayload {
val checkinInfo: BlePayload = BlePayload(0, 1, 0x02, 1, "me@emailaddr.com")
return checkinInfo
}
...
private fun writeCharacteristic(characteristic: BluetoothGattCharacteristic) {
val payload = BluetoothUtils.packagePayload()
val strByteArray = payload.toString()
val byteArray = strByteArray.toByteArray()
mClientActionListener.log(TAG_GATT_CLIENT_CALLBACK, "Writing to characteristic ${characteristic.uuid}")
mClientActionListener.log(TAG_GATT_CLIENT_CALLBACK, "** strByteArray = $strByteArray")
mClientActionListener.log(TAG_GATT_CLIENT_CALLBACK, "** byteArray = $byteArray")
mClientActionListener.log(TAG_GATT_CLIENT_CALLBACK, "** Writing the Payload: $payload")
characteristic.setValue(byteArray)
}
但这似乎既麻烦又错误。然而,我看不到另一种解决方法
它需要是外设的字节数组
我找不到一种不先将字节数组变成字符串的方法
我看不到直接使用混合类型的字节数组的方法
我确信我一定是错了——我似乎太新了,不明白科特林医生告诉我的是什么
感谢您的关注。因此我最终放弃了数据对象的概念,转而支持:
fun packagePayload(): ByteArray {
var payloadArray: ByteArray = ByteArray(0)
payloadArray = payloadArray.plus(0.toByte())
payloadArray = payloadArray.plus(1.toByte())
payloadArray = payloadArray.plus(2.toByte())
payloadArray = payloadArray.plus(1.toByte())
payloadArray = payloadArray.plus("me@addr.com".toByteArray(Charsets.US_ASCII))
Log.i(TAG_BLEUTIL, "** output of array: " + payloadArray.contentToString())
// [0, 1, 2, 1, 109, 101, 64, 97, 100, 100, 114, 46, 99, 111, 109]
return payloadArray
}
结果变得简单多了
这里有一个陷阱:如果您想要4字节整数,那么Kotlin helper并没有让您轻松的乐趣
因此,您需要这样做才能获得4字节Int:
fun Int.toBytes() : ByteArray {
var retArray = ByteArray(0)
for(i in 0..3) {
retArray = retArray.plus((this shr (i * 8) and 0xFF).toByte())
}
return retArray//.reversedArray()
}
在这种情况下,您可以这样使用它:
payloadArray = payloadArray.plus(0.toBytes())
请注意函数末尾的“/.reversedArray()”。以防需要在小端和大端之间切换
希望这对将来的人有帮助
如果您有更好的解决方案,请告诉我
<>谢谢 如果你可以在图书馆里帮忙完成这项任务,我会考虑用Square做这个。过去我用它来做这种小摆弄。您的示例与Okio类似:
fun packagePayload(): ByteArray =
Buffer()
.writeInt(0)
.writeInt(1)
.writeInt(2)
.writeInt(1)
.writeString("me@addr.com", Charsets.US_ASCII)
.readByteArray()
Okio还提供上述方法的小端版本(即
writeIntLe()
)。如何将其转换回原始对象?您可以使用缓冲区在ByteArray中读回,并按照字段添加的顺序读取字段。Buff#readyFully将读取整个数组。