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

如何解码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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:35:13