Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 混合类型的Kotlin ByteArray_Android_Kotlin_Bluetooth Lowenergy - Fatal编程技术网

Android 混合类型的Kotlin ByteArray

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

我需要在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 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将读取整个数组。