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

Swift 4中如何用另一个Data([UInt8])分割Data类型数据?

实现Data按另一个Data分割的方法

嗨,作为Swift新手碰到这个问题太正常了——官方的Data.split(...)方法确实只支持单个UInt8作为分隔符,要处理整个Data作为分隔符的场景,确实得自己实现一个遍历查找的逻辑,不过操作起来没那么复杂,我给你写个实用的扩展方法:

扩展Data实现自定义split方法

直接给Data加一个扩展,实现你想要的split(separator: Data)功能:

extension Data {
    func split(separator: Data) -> [Data] {
        guard !separator.isEmpty else { return [] }
        
        var resultChunks: [Data] = []
        var currentPosition = startIndex
        
        // 循环查找分隔符的位置
        while let separatorRange = self[currentPosition...].range(of: separator) {
            // 截取当前位置到分隔符起始处的片段
            resultChunks.append(self[currentPosition..<separatorRange.lowerBound])
            // 跳过分隔符,更新下一次查找的起始位置
            currentPosition = separatorRange.upperBound
        }
        
        // 添加最后一段未被分隔的内容(如果存在)
        if currentPosition <= endIndex {
            resultChunks.append(self[currentPosition...])
        }
        
        return resultChunks
    }
}

代码逻辑说明

  • 首先判断分隔符是否为空,避免后续逻辑出现异常;
  • 用range(of:)方法在剩余的Data片段里查找分隔符的位置,这个方法会返回第一个匹配的范围;
  • 每次找到分隔符后,截取前面的部分加入结果数组,然后把查找起始位置跳到分隔符的末尾;
  • 循环结束后,处理最后一段没有被分隔符截断的内容,确保不会遗漏。

测试你的示例数据

用你提供的测试数据跑一下:

var data: Data = Data([0x00, 0x00, 0x00, 0x01, 0xAB, 0x02, 0x03, 0x00, 0x00, 0x00, 0x01, 0xEE, 0xBB, 0x14, 0x24])
var separator: Data = Data([0x00, 0x00, 0x00, 0x01])

let splitResult = data.split(separator: separator)
// 结果数组包含3个元素:
// 1. 空Data(第一个分隔符前没有内容)
// 2. Data([0xAB, 0x02, 0x03])
// 3. Data([0xEE, 0xBB, 0x14, 0x24])

这个行为和你预期的data.split(separator: separator)完全一致,而且和Swift字符串的split逻辑保持了一致(比如连续分隔符会生成空元素)。

如果是处理超大体积的Data,这个方法的效率也足够日常使用,要是有极致性能需求,可以考虑优化查找算法,但一般场景下这个实现就够用啦~

内容的提问来源于stack exchange,提问作者Jorge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:34:24