从 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) }
这样您的输出将被正确格式化。
我正在开发一个使用 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) }
这样您的输出将被正确格式化。