从 bytearray 转换为 hexa Kotlin

Cast from bytearray to hexa Kotlin

我正在开发一个使用 ble 接收连续数据流的应用程序,此时我正确读取了设备发送的数据流,但实际上我不知道如何解释它。

这是我的 onCharacteristicChanged 函数

    override fun onCharacteristicChanged(
        gatt: BluetoothGatt,
        characteristic: BluetoothGattCharacteristic?
    ) {
        if (characteristic != null && characteristic.properties == BluetoothGattCharacteristic.PROPERTY_NOTIFY) {
            Log.e(TAG, "**THIS IS A NOTIFY MESSAGE")
        }
        if (characteristic != null) {
            data = characteristic.value
            Log.e("onCharacteristicChanged", "Datos:")
            Log.e("onCharacteristicChanged", "$data")
            val dataparsed = data?.joinToString ( " : " )
            Log.e("onCharacteristicChanged", "$dataparsed")
            broadcastUpdate("com.np.lekotlin.ACTION_DATA_AVAILABLE")

        }
    }

每次设备向我发送一些信息时都会调用此函数,并返回如下所示的退出:

在哪里我们可以看到对同一数据的两种解释

未经处理的数据(bytearray): [乙@**** 以及 joinToString 之后的数据(我认为它会帮助我转换为 hexa 的函数): ** : **: **: **: **: **: **: **: **: ** <-- 但是这里有负数!!

当我将此输出与我正在使用的另一个软件 CySmart 返回的结果进行比较时,我的问题就来了

给我 returns 我喜欢的东西

07:94:02:5A:56:00:76:35:00:00

07:2F:02:5F:45:00:B0:36:00:00

07:E4:01:50:47:00:6D:37:00:00

07:0C:02:53:4A:00:56:38:00:00

此输出显然遵循一种模式,例如前 7 组和后 2 组 0,但负数让我感到困惑。

所以,总而言之,我的问题是,在 kotlin 中是否存在从 bytearray 转换为 hexa 的原生方式? (没有负数) 如果我已经正确地铸造了它,你知道我该如何治疗,或者赞助人的负数是多少?好像是 2 的补码或类似的东西,但我不确定。

非常感谢您的建议。

正如其他人已经提到的,字节数组中的负数仅意味着该数字大于 127。

关于如何将它们显示为十六进制的问题,您可以使用内置的字符串格式化函数。您可以在 joinToString 调用中添加一个转换块,它可以将您的字节转换为十六进制字符串:

val dataparsed = data?.joinToString ( " : " ) { "%02x".format(it) }

这样您的输出将被正确格式化。