Swift 4拆分其他数据的数据([Uint8])

时间:2018-05-22 20:56:48

标签: swift

我对Swift很陌生,我正在寻找一种方法将Data数据类型拆分为另一个Data的较小块。我在Apple文档中找不到任何合适的方法。每个方法(拆分,过滤,索引......)只需传递UInt8即可,但我需要传递[Uint8]

例如:

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

我需要data.split(separator: separator)之类的东西。

是否有任何合适的方法可以执行此操作,还是应该遍历整个缓冲区?

1 个答案:

答案 0 :(得分:3)

我不知道内置方法。一个可能的解决方案是打电话  range(of:)重复查找所有出现的分隔符数据, 并将分隔符之间的块附加到数组:

extension Data {
    func split(separator: Data) -> [Data] {
        var chunks: [Data] = []
        var pos = startIndex
        // Find next occurrence of separator after current position:
        while let r = self[pos...].range(of: separator) {
            // Append if non-empty:
            if r.lowerBound > pos {
                chunks.append(self[pos..<r.lowerBound])
            }
            // Update current position:
            pos = r.upperBound
        }
        // Append final chunk, if non-empty:
        if pos < endIndex {
            chunks.append(self[pos..<endIndex])
        }
        return chunks
    }
}

示例:

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

let chunks = data.split(separator: separator)
for chunk in chunks {
    print(chunk as NSData)
}

输出:

<ab0203>
<eebb1424>