我正在尝试将两个NSData
个对象连接成一个NSMutableData
,而不是让它们回来。现在我正试图这样做:
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))
也许有人知道我的问题在哪里或者如何获取数据?
答案 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
,对吧?