2015-05-31 57 views
1

我试图将两个NSData对象连接成一个NSMutableData,而不是让他们回来。现在我试图这样做:Swift。如何将字节从NSData写入另一个NSData?

  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) 

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

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

但是,当我试图让数据我得到崩溃,而不是:

var data = NSData() 

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

也许有人知道哪里是我的问题还是如何让DATAS?

回答

2

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

+0

除非我读错了,否则问题是如何连接两批数据,并在此之前以第一批数据的长度开始数据。这似乎没有回答,它需要已经形成的数据并返回基于sizeof(Int)和长度的子范围。我不明白这个范围与问题的问题有什么关系。 – sketchyTech

+1

@GoodbyeStackOverflow:从问题:*“然后我想获取数据...但是当我试图获取数据时,我正在崩溃,而不是”* - 据我了解的问题,这是关于提取数据部分再次。我衷心希望如果OP没有解决问题,OP不会接受答案。 –

+0

是的,你说得对。我误解了这个问题。抱歉。它把我和UInt8和Int混合在一起,但我猜它可行(防止在32位和64位系统之间移动?)。 – sketchyTech

0

这可以在我的故事板没有崩溃的情况下完美运行。我在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,对吧?