Swift。如何将 NSData 中的字节写入另一个 NSData?
Swift. How to write bytes from NSData into another NSData?
我正在尝试将两个 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))
也许有人知道我的问题在哪里或如何获取数据?
您可以使用 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
指向对象的 指针 。你正在覆盖这个指针
以及内存中的以下字节。
这在我的情节提要中没有崩溃,效果很好。我只是省略了 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
吧?
我正在尝试将两个 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))
也许有人知道我的问题在哪里或如何获取数据?
您可以使用 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
指向对象的 指针 。你正在覆盖这个指针
以及内存中的以下字节。
这在我的情节提要中没有崩溃,效果很好。我只是省略了 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
吧?