ios – 在Swift 3中提取Data对象的片段

ios – 在Swift 3中提取Data对象的片段,第1张

概述我有一个60字节的数据流,如下所示 let myDataStream = Data(bytes: [24, 163, 209, 194, 255, 1, 184, 230, 37, 208, 140, 201, 6, 0, 64, 0, 7, 98, 108, 117, ...]) 字节#1(索引0)表示第一个对象的长度,因此在这种情况下,第一个对象由前24个对象组成,包括字节#1 我尝试了很多方 我有一个60字节的数据流,如下所示

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对象的片段所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1077884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存