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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:52:08