如何从Data对象中获取字节数组并截取指定子集?
解决方法
你可以通过Data的subdata(in:)方法来截取指定范围的字节子集,同时需要注意处理可选值和越界问题,避免崩溃。修改后的代码如下:
func fileTransfer(fileData: Data?) { let byteCount: Int = 128 let startByte: Int = 0 // 先解包可选的fileData,同时检查起始位置是否合法 guard let data = fileData, startByte < data.count else { // 这里可以添加fileData为空或起始位置越界的处理逻辑,比如打印日志 return } // 计算有效的结束位置,避免超出数据总长度 let endByte = min(startByte + byteCount, data.count) // 截取指定范围的Data子集 let dataSubset = data.subdata(in: startByte..<endByte) connectedPeripheral.writeValue(dataSubset, for: fileBlockCharacteristic, type: CBCharacteristicWriteType.withResponse) }
代码说明:
- 可选值处理:用
guard let解包fileData,避免空值引发的崩溃; - 越界防护:检查
startByte是否小于数据总长度,确保起始位置合法; - 安全截取:用
min(startByte + byteCount, data.count)计算结束位置,保证即使剩余数据不足128字节,也只会截取到数据末尾,不会越界; - 截取方法:
subdata(in:)是Data的原生方法,传入一个半开区间startByte..<endByte,直接返回截取后的Data对象,正好符合writeValue的参数要求。
内容的提问来源于stack exchange,提问作者lcj
相关产品推荐
相关产品推荐

