如何将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
相关产品推荐
相关产品推荐

