这是一个实际问题,我通过将文件分成 1000 字节的主干来发送文件
data = NSData.dataWithContentsOfFile(path)
var dataPackage : [Byte](count: 1000, repeatedValue: 0)
for offset = 0; offset < data.length; {
// omit some range check here
data.getBytes(&dataPackage, NSRange(location: offset, length: 1000))
send(dataPackage)
}
一切都很好,直到我想在 dataPackage 中的位置 0 处插入一个序列号,所以很自然地,我会将上面的更改为
data.getBytes(&dataPackage[1], NSRange(location: offset, length: 999))
结果证明只有 1 个单个元素被复制到 dataPackage。其余 999 个元素被复制到不知道的地方
我的问题是,1)如何进行这项工作,以及 2)如何处理 swift 中的数组,这样 &data[i] = &data + i(如第一个示例所示)但是 &data[i+k] != &data[i] + k
编辑:我通过做解决了(1)
data.getBytes(&dataPackage + 1, NSRange(location: offset, length: 999))
问题(2)仍然存在
最佳答案
不要 getBytes(&dataPackage[i] + k, ..)
,我认为,这可能会导致“访问冲突”
考虑这个代码:
struct MyStruct {
var _val = [Int](count: 1000, repeatedValue: 0);
subscript(idx:Int) -> Int {
get {
println("get: [\(idx)] -> val(\(_val[idx]))")
return _val[idx]
}
set(val) {
println("set: [\(idx)] old(\(_val[idx])) -> new(\(val))")
_val[idx] = val
}
}
}
func myFunc(ptr:UnsafeMutablePointer<Int>, val:Int) {
println("mutating: ptr(\(ptr)) <- \(val)")
ptr.memory = val
}
MyStruct
只是 Array
的包装器。myFunc
接收一个可变指针并改变它的值。有了这个,当你这样做时:
var foo = MyStruct()
myFunc(&foo[1], 12)
输出:
get: [1] -> val(0)
mutating: ptr(0x00007fff561619d8) <- 12
set: [1] old(0) -> new(12)
看?
somewhere
somewhere
somewhere
不过,我不知道
somewhere
在哪里。当你喜欢:
var foo = MyStruct()
myFunc(&foo[1] + 1, 12)
输出:
get: [1] -> val(0)
set: [1] old(0) -> new(0)
mutating: ptr(0x00007fff5c0b79e0) <- 12
这一次,我的猜测是:
somewhere
corrupted
作为 somewhere + 1
somewhere
somewhere
corrupted
另一方面,当你这样做时:
var foo = [Int](count:1000, repeatedValue:0)
myFunc(&foo + 1, 12)
这表示:
ptr
作为 foo
ptr
作为 ptr + 1
ptr
结果,
foo[1]
将像您一样成功地成为 12
。实际上
&
的in-out(Array
)很特别,正如the document.中提到的只有内置的
Array
具有最后一个功能。因此,当您将
¬AnArrayLvalue
(包括 &array[i]
)传递给 UnsafeMutablePointer<Type>
参数时,长度应始终为 1
,而您不应将 +
或 -
传递给它。关于arrays - Swift 数组元素地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26395961/