使用CoreBluetooth向外设发数据失败,能否发送有符号数组?
问题解答:能否以有符号数组形式发送CoreBluetooth指令
结论:完全可以,且发送的实际二进制数据和无符号数组版本完全一致
核心原因
你给出的两组数组本质是同一组二进制字节的不同解读方式:
- iOS中使用的
UInt8是无符号8位整数,范围0-255 - Android中使用的
byte是有符号8位整数(对应Swift的Int8),范围-128到127
两个数组中的对应元素是补码等价的:比如无符号的178转换成有符号就是178 - 256 = -78;无符号的186对应186-256=-70,以此类推。蓝牙传输的是原始字节流,和数值的符号表示无关,所以两种数组对应的二进制数据完全相同,设备接收后解析结果一致。
结合你的代码说明
你当前的代码用[UInt8]加密后转成Data发送,这是完全正确的。如果要改成有符号数组形式发送,只需要将加密后的[UInt8]转换为[Int8]再生成Data即可,示例代码如下:
guard let commandEncrpt = AESEncrypt(data: command) else{ return } // 将无符号数组转换为有符号数组 let signedCommand = commandEncrpt.map { Int8(bitPattern: $0) } // 从有符号数组生成Data let resultCommand = Data(bytes: signedCommand, count: signedCommand.count) self.writeCommand(command: resultCommand)
不过实际上这一步转换是多余的——因为Data本质是字节的集合,从[UInt8]初始化和从对应的[Int8]初始化得到的Data完全一致,蓝牙发送的字节流没有任何区别。
补充说明
Android中使用有符号数组只是因为Java/Kotlin的byte类型本身是有符号的,这是语言层面的类型差异,和底层传输的二进制数据无关。只要你的加密逻辑在iOS和Android端保持一致(比如相同的AES密钥、ECB模式、无填充),不管用有符号还是无符号数组表示指令,最终设备收到的加密数据都是完全相同的。
内容的提问来源于stack exchange,提问作者SwiftNinja95
相关产品推荐
相关产品推荐

