gpt4 book ai didi

ios - 在 Swift 3 中提取数据对象的片段

转载 作者:搜寻专家 更新时间:2023-10-30 22:29:28 24 4
gpt4 key购买 nike

我有一个 60 字节的 Data 流,如下所示

let myDataStream = Data(bytes: [24, 163, 209, 194, 255, 1, 184, 230, 37, 208, 140, 201, 6, 0, 64, 0, 7, 98, 108, 117, ...])

Byte #1 (index 0) 表示第一个对象的长度,所以在这种情况下,第一个对象由前 24 个对象组成,包括 byte #1

我尝试了很多方法,但我一直想不通

  1. 如何将前 24 个字节提取到新数据对象中

  2. #1 完成后,如何从 myDataStream 中删除前 24 个字节。由于字节 #25 将再次具有下一个对象的大小

我最接近解决#1 的是

let streamLength = Int(myDataStream[0])
let newStream = Data(bytes: myDataStream[0...streamLength])

但我收到一条错误消息,指出 cannot invoke initializer for Data with Data.subsequence

最佳答案

您可以结合使用 subdataremoveSubRange 方法来实现您想要的结果。

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, 163, 209, 194, 255, 1, 184, 230, 37, 208, 140, 201, 6, 0, 64, 0, 7, 98, 108, 117, 42, 63, 78, 200, 3, 34, 36])

// First extraction
let first = extract(from: &data)
print(first!) // Prints 24 bytes
print(data) // Prints 3 bytes

// Second extraction
let second = extract(from: &data)
print(second!) // Prints 3 bytes
print(data) // Prints 0 bytes

// Third extraction
let third = extract(from: &data)
print(third ?? "No Data") // Prints "No Data"

进行扩展

您还可以将上面的 extract 方法包装在 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, 163, 209, 194, 255, 1, 184, 230, 37, 208, 140, 201, 6, 0, 64, 0, 7, 98, 108, 117, 42, 63, 78, 200, 3, 34, 36])

// First extraction
let first = data.extract()
print(first!) // Prints 24 bytes
print(data) // Prints 3 bytes

// Second extraction
let second = data.extract()
print(second!) // Prints 3 bytes
print(data) // Prints 0 bytes

// Third extraction
let third = data.extract()
print(third ?? "No Data") // Prints "No Data"

关于ios - 在 Swift 3 中提取数据对象的片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41082760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com