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

如何将Calypso仪器BLE数据的2字节小端uint16转换为Int?

解决Calypso太阳风仪器BLE数据转Int的问题

你原来的代码没明确指定读取的是小端UInt16,直接赋值给Int会有类型不匹配和字节序错误的问题,给你两种可靠的实现方式:

方法一:明确处理字节序和类型

// 先校验数据长度必须是2字节(对应uint16)
guard data.count == 2 else {
    print("错误:接收的数据不是2字节,无法解析为uint16")
    return
}

// 读取小端格式的UInt16值
let uint16WindSpeed = data.withUnsafeBytes { buffer in
    buffer.load(as: UInt16.self).littleEndian
}

// 直接转换为Int(UInt16范围0-65535,Int完全能容纳)
let windSpeed: Int = Int(uint16WindSpeed)

方法二:简化写法

guard data.count == 2 else {
    print("数据长度不符合要求")
    return
}

let uint16WindSpeed = UInt16(littleEndian: data.withUnsafeBytes { $0.pointee })
let windSpeed = Int(uint16WindSpeed)

关键说明

  • 必须先校验data.count == 2:仪器输出的是2字节数据,如果接收的数据长度不对,解析出来的数值肯定是错的
  • 一定要指定littleEndian:仪器输出的是小端格式,不处理字节序的话,在大端设备上读取的数值会完全颠倒
  • UInt16转Int是安全的:UInt16的最大值是65535,Swift的Int在iOS/macOS等平台是64位,完全能覆盖这个范围,不会出现溢出问题

内容的提问来源于stack exchange,提问作者Thomas Spieler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:22:05