let myDataStream = Data(bytes: [24,163,209,194,255,1,184,230,37,208,140,201,6,64,7,98,108,117,...])
字节#1(索引0)表示第一个对象的长度,因此在这种情况下,第一个对象由前24个对象组成,包括字节#1
我尝试了很多方法,但我一直无法弄清楚
>如何将前24个字节提取到新的Data对象中
>#1完成后,如何从myDataStream中删除前24个字节.字节#25将再次具有下一个对象的大小
我最接近解决#1的是
let streamLength = Int(myDataStream[0])let newStream = Data(bytes: myDataStream[0...streamLength])
但是我得到一个错误,说明无法使用Data.subsequence调用Data的初始化程序
解决方法 您可以结合使用subdata和removeSubRange方法来获得所需的结果.subData(in :)是Data结构上的实例方法.
removeSubRange()也是Data结构上的实例方法.
您可以在此处阅读有关这些方法的更多信息:https://developer.apple.com/reference/foundation/data
示例方法:
func extract(from data: inout Data) -> Data? { guard data.count > 0 else { return nil } // define the length of data to return let length = Int.init(data[0]) // Create a range based on the length of data to return let range = Range(0..<length) // Get a new copy of data let subData = data.subdata(in: range) // Mutate data data.removeSubrange(range) // Return the new copy of data return subData}
用法:
// Data (27 bytes)var data = Data(bytes: [24,42,63,78,200,3,34,36])// First extractionlet first = extract(from: &data)print(first!) // Prints 24 bytesprint(data) // Prints 3 bytes// Second extractionlet second = extract(from: &data)print(second!) // Prints 3 bytesprint(data) // Prints 0 bytes// Third extractionlet third = extract(from: &data)print(third ?? "No Data") // Prints "No Data"
进行扩展
您还可以将上面的提取方法包装在Data的扩展中,如下所示:
extension Data { mutating func extract() -> Data? { guard self.count > 0 else { return nil } // define the length of data to return let length = Int.init(self[0]) // Create a range based on the length of data to return let range = Range(0..<length) // Get a new copy of data let subData = self.subdata(in: range) // Mutate data self.removeSubrange(range) // Return the new copy of data return subData }}
然后你可以使用这样的方法:
// Data (27 bytes)var data = Data(bytes: [24,36])// First extractionlet first = data.extract()print(first!) // Prints 24 bytesprint(data) // Prints 3 bytes// Second extractionlet second = data.extract()print(second!) // Prints 3 bytesprint(data) // Prints 0 bytes// Third extractionlet third = data.extract()print(third ?? "No Data") // Prints "No Data"总结
以上是内存溢出为你收集整理的ios – 在Swift 3中提取Data对象的片段全部内容,希望文章能够帮你解决ios – 在Swift 3中提取Data对象的片段所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)