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

时间:2015-05-31 15:57:26

标签: ios swift byte nsdata

我正在尝试将两个NSData个对象连接成一个NSMutableData,而不是让它们回来。现在我正试图这样做:

  1. 获取第一个物体的长度。
  2. 按此顺序写入NSMutableData:第一个对象长度,第一个对象,第二个对象。
  3. 代码如下:

    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))
    

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

2 个答案:

答案 0 :(得分:3)

您可以使用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 指针指向对象。你正在覆盖这个指针 以及内存中的以下字节。

答案 1 :(得分:0)

这在我的故事板中没有崩溃的情况下完美运行。我在var之前省略了第二个length,以避免重新定义它。

以下是每行的输出:

"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,对吧?