在Kotlin中如何将两个Byte正确转换为UInt16?
正确实现两个Byte转UInt16的Kotlin代码
你的代码主要存在三个问题:一是Kotlin的UShort类型不支持移位操作符(shl/shr),移位仅对Int、Long、UInt、ULong类型生效;二是直接将有符号Byte转为UShort会触发符号扩展,导致负数Byte(如0x80即-128)被错误转换为0xFF80,最终计算结果偏离预期;另外代码还缺少一个闭合括号,语法无法通过。
下面是两种正确的实现方式:
方式1:返回UInt类型(匹配你的函数签名)
fun bytesToUInt16(b1: Byte, b2: Byte): UInt { // 将Byte转为无符号8位值,消除符号扩展影响 val highByte = b1.toUInt() and 0xFFu val lowByte = b2.toUInt() and 0xFFu // 高位左移8位后与低位合并 return (highByte shl 8) or lowByte }
方式2:返回UShort类型(更贴合UInt16语义)
如果需要严格的16位无符号类型,推荐返回UShort:
fun bytesToUShort(b1: Byte, b2: Byte): UShort { val highByte = b1.toUInt() and 0xFFu val lowByte = b2.toUInt() and 0xFFu return ((highByte shl 8) or lowByte).toUShort() }
关键细节解释
Byte是有符号类型,转UInt时会自动符号扩展(比如-1即0xFF会变成0xFFFFFFFF),通过and 0xFFu可以只保留低8位的无符号数值,避免高位被错误填充1。- 移位操作必须在
UInt/ULong类型上执行,所以我们先完成Byte到UInt的安全转换,再进行移位和合并操作。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

