gpt4 book ai didi

swift - Swift 中的子数据方法似乎没有按照我的意愿进行

转载 作者:行者123 更新时间:2023-11-28 11:34:37 24 4
gpt4 key购买 nike

我在 playground (Swift 5) 中有以下代码

import Foundation

let array : [UInt8] = [0,1,2,3,4,5,6,7,8,9,10,11,12]
public extension Data {
func uint32( offset:Int)-> UInt32{

let range = offset..<(offset+4)
let copy = self.subdata(in: range)

print(copy as NSData) // Prints <02030405>

return copy.withUnsafeBytes{
$0.load(fromByteOffset: 0, as: UInt32.self).bigEndian
}
}
}

let data = Data(array)
let datadropped = data.dropFirst(2)
print(data as NSData) // Prints <00010203 04050607 08090a0b 0c>
print(datadropped as NSData) // Prints <02030405 06070809 0a0b0c>


let sub = data.subdata(in: 4..<8 ) // gives 4,5,6,7
let sub2 = datadropped.subdata(in: 4..<8) // also gives 4,5,6,7

data.uint32(offset: 2)

现在,如果我将最后一行的偏移量设置为 0 或 1,它就会崩溃。偏移量 2 有效,但返回一个使用字节 02,03,04,05 构造的 uint,这不是我所期望的。文档说明 dropFirst() 和 subdata() 返回数据的副本。

我确实让我的 uint32 函数与以下代码一起工作。但我想知道为什么初始函数中的字节范围不起作用。我如何强制使用真正的新数据副本?如果有人能向我解释一下,我将不胜感激。

extension Data
func uint32( offset:Int)-> UInt32{
let array = Array(0...3).map {
uint8(offset: $0+ offset)
}
return array.withUnsafeBytes{
$0.load(fromByteOffset: 0, as: UInt32.self).bigEndian
}
}

func uint8( offset:Int)-> UInt8 {
return self.withUnsafeBytes{
$0.load(fromByteOffset: offset, as: UInt8.self).bigEndian
}
}
}

最佳答案

datadroppedSlice

它包含数据的子集,但它与原始集合共享相同的索引。它崩溃是因为 datadropped 的第一个索引是 2,而不是 0。

要获取新的Data 对象,您必须编写

let datadropped = Data(data.dropFirst(2))

关于切片的更多信息请观看WWDC 2018: Using Collections Effectively (从 11:00 开始)

注意:可以去掉fromByteOffset参数

return copy.withUnsafeBytes{
$0.load(as: UInt32.self).bigEndian
}

关于swift - Swift 中的子数据方法似乎没有按照我的意愿进行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55871727/

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