Search code examples
iosswiftbytensdata

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


I'm trying to concatenate two NSData objects into one NSMutableData, and than get them back. For now i'm trying to do it in such way:

  1. Get length of first object.
  2. Write into NSMutableData in such order: first object length, first object, second object.

Code looks like:

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)

Then I want to get datas back. So I suppose to read first data length and then get two datas.

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

But when I'm trying to get data I'm getting crash instead:

    var data = NSData()

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

Maybe somebody know where is my problem or how to get datas?


Solution

  • You can extract the data using subdataWithRange():

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

    Your solution

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

    does not work and crashes because NSData is a reference type and data a pointer to the object. You are overwriting this pointer and the following bytes in memory.