2015-05-31 103 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,對吧?