这是一个实际问题,我通过将文件分成 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 具有最后一个功能。

    因此,当您将 &notAnArrayLvalue (包括 &array[i] )传递给 UnsafeMutablePointer<Type> 参数时,长度应始终为 1 ,而您不应将 +- 传递给它。

    关于arrays - Swift 数组元素地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26395961/

    10-10 02:07