Kotlin Android Studio调试问题:UInt8转UInt16数值异常排查
问题原因与解决方案
问题根因
你代码里的characteristic.value元素是有符号Byte类型,而非无符号UInt8。Byte的取值范围是-128到127,当原数值超过127时,会被存为负数(比如128对应Byte的-128)。调用toUInt()时会触发符号扩展——把Byte的符号位(最高位)填充到UInt的所有高位,导致原本应该是0x00的高位字节被错误置为0xFF,最终拼接出65408(0xFF80)这类异常值。
解决方案
在转换为UInt前,先将Byte转为无符号的UByte,避免符号扩展。修改后的代码如下:
val strValue = (characteristic.value[1].toUByte().toUInt().shl(8) or characteristic.value[2].toUByte().toUInt()).toUShort()
也可以拆分步骤,让逻辑更清晰:
val highByte = characteristic.value[1].toUByte() val lowByte = characteristic.value[2].toUByte() val strValue = (highByte.toUInt() shl 8 or lowByte.toUInt()).toUShort()
这样处理后,Byte转UByte会保留原始的8位无符号数值,比如原Byte的-128会被转为UByte的0x80,后续位操作就能得到正确的UInt16结果。
内容的提问来源于stack exchange,提问作者NIXIE_123
相关产品推荐
相关产品推荐

