Swift。如何将 NSData 中的字节写入另一个 NSData?

Swift. How to write bytes from NSData into another NSData?

我正在尝试将两个 NSData 对象连接成一个 NSMutableData,然后再取回它们。现在我正在尝试以这种方式进行:

  1. 获取第一个对象的长度。
  2. 按顺序写入NSMutableData:第一个对象长度,第一个对象,第二个对象。

代码如下:

let firstString = "first_string";
let secondString = "secondSting";

let firstData = firstString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
let secondData = secondString.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!


let mutableData = NSMutableData()

var length = firstData.length

mutableData.appendBytes(&length, length: sizeof(Int))

mutableData.appendData(firstData)

mutableData.appendData(secondData)

然后我想取回数据。所以我想读取第一个数据长度然后得到两个数据。

    var length = 0
    mutableData.getBytes(&length, length: sizeof(Int))

但是当我尝试获取数据时却崩溃了:

    var data = NSData()

    mutableData.getBytes(&data, range: NSMakeRange(sizeof(Int), length))

也许有人知道我的问题在哪里或如何获取数据?

您可以使用 subdataWithRange():

提取数据
let firstData1 = mutableData.subdataWithRange(NSMakeRange(sizeof(Int), length))
if let firstString1 = NSString(data: firstData1, encoding: NSUTF8StringEncoding) as? String {
    println(firstString1)
} else {
    // bad encoding
}

你的解决方案

var data = NSData()
mutableData.getBytes(&data, range: NSMakeRange(sizeof(Int), length))

不起作用并崩溃,因为 NSData 是引用类型并且 data 指向对象的 指针 。你正在覆盖这个指针 以及内存中的以下字节。

这在我的情节提要中没有崩溃,效果很好。我只是省略了 length 之前的第二个 var 以避免重新定义它。

这是每行的输出:

"first_string"
"secondSting"
<66697273 745f7374 72696e67>  // let firstData = ...
<7365636f 6e645374 696e67>    // let secondData = ...
<>                            // let mutableData = ...
12                            // var length = ...
// appending data
<0c000000 00000000>           
<0c000000 00000000 66697273 745f7374 72696e67>
<0c000000 00000000 66697273 745f7374 72696e67 7365636f 6e645374 696e67>
0                            // length = 0
<0c000000 00000000 66697273 745f7374 72696e67 7365636f 6e645374 696e67>
12                           // length

这意味着您可能在其他地方有错误。你没有重新定义length吧?