You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 06:54:56