我对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)
之类的东西。
是否有任何合适的方法可以执行此操作,还是应该遍历整个缓冲区?
答案 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>