如何解码BLE特征值?iOS中获取十六进制字符串"02"方法咨询
解决1字节特征值转十六进制字符串"02"的问题
这个问题很常见——你现在是把字节当成UTF8编码的字符来解析,但0x02属于ASCII控制字符,并不是可打印的UTF8字符,所以才会得到Optional("\u{02}")这样的结果。咱们换个思路,直接把字节的数值转换成十六进制格式的字符串就能得到你想要的"02"了,具体实现如下:
针对单字节的情况(你的场景)
在didUpdateValueFor方法里,安全解包特征值后,直接取出字节并格式化:
func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { guard let data = characteristic.value, !data.isEmpty else { print("未获取到有效特征值") return } // 因为是1字节,直接取第一个元素 let byte = data[0] // 使用%02X格式化:%02表示不足两位补0,X表示大写十六进制(用x则是小写) let hexString = String(format: "%02X", byte) print(hexString) // 输出 "02" }
扩展:多字节场景的通用处理
如果后续遇到多字节的特征值,也可以用这个通用方法把所有字节拼接成连续的十六进制字符串:
let hexString = data.map { String(format: "%02X", $0) }.joined() // 比如data是0x02 0x0A,会得到"020A"
为什么之前的方法不行?
String(data:encoding:)是把字节序列当作指定编码(这里是UTF8)的字符来解析,但0x02对应的是ASCII里的**文本开始(STX)**控制字符,没有对应的可打印UTF8字符,所以会显示成转义序列\u{02},这和你想要的十六进制数值表示完全是两回事。
内容的提问来源于stack exchange,提问作者user8562024
相关产品推荐
相关产品推荐

