Swift 将nsData解码为字符串数组
我想将nsData解码为字符串数组。我现在有这个代码:Swift 将nsData解码为字符串数组,swift,Swift,我想将nsData解码为字符串数组。我现在有这个代码: func nsDataToStringArray(data: NSData) -> [String] { var decodedStrings = [String]() var stringTerminatorPositions = [Int]() var currentPosition = 0 data.enumerateBytes(
func nsDataToStringArray(data: NSData) -> [String] {
var decodedStrings = [String]()
var stringTerminatorPositions = [Int]()
var currentPosition = 0
data.enumerateBytes() {
buffer, range, stop in
let bytes = UnsafePointer<UInt8>(buffer)
for i in 0 ..< range.length {
if bytes[i] == 0 {
stringTerminatorPositions.append(currentPosition)
}
currentPosition += 1
}
}
var stringStartPosition = 0
for stringTerminatorPosition in stringTerminatorPositions {
let encodedString = data.subdata(with: NSMakeRange(stringStartPosition, stringTerminatorPosition - stringStartPosition))
let decodedString = NSString(data: encodedString, encoding: String.Encoding.utf8.rawValue)! as String
decodedStrings.append(decodedString)
stringStartPosition = stringTerminatorPosition + 1
}
return decodedStrings
}
func-nsdatatostringaray(数据:NSData)->[String]{
var decodedStrings=[String]()
变量stringTerminatorPositions=[Int]()
var currentPosition=0
data.enumerateBytes(){
缓冲区,范围,停止
let bytes=UnsafePointer(缓冲区)
对于0..
但是我在这一行得到一个错误:let bytes=UnsafePointer(buffer)
无法使用
类型为“(UnsafeRawPointer)”的参数列表
是否需要将缓冲区转换为非安全指针?如果是这样,我该怎么做?
enumerateBytes()中的buffer
闭包是一个UnsafeRawPointer
您必须将其“重新绑定”到Swift 3中的UInt8
指针:
// let bytes = UnsafePointer<UInt8>(buffer)
let bytes = buffer.assumingMemoryBound(to: UInt8.self)
这是怎么回事
数据
是UInt8的序列
,因此
split(分隔符:0)
可以在其上调用,返回
“数据切片”(是源数据的视图,而不是副本)
- 每个“数据片”同样是
UInt8
的序列,其中
字符串
可以使用字符串(字节:$0,编码:.utf8)创建
。
这是一个可失败的初始值设定项(因为数据可能是无效的UTF-8)
flatMap{…}
返回一个包含所有非nil结果的数组,
i、 e.包含可从中创建的所有字符串的数组
零字节之间的有效UTF-8代码序列
在Swift 3中,我更喜欢签名func stringArray(来自nsData:nsData)
;-)@瓦迪安:真的!或func-stringArray(来自数据:data)
,如果可能的话我保留了这个名字,以便OP可以直接用他/她的代码测试它。我们不需要谈论在Swift 3中滥用过时的<代码> NS…< /代码>基础类…
func nsDataToStringArray(nsData: NSData) -> [String] {
let data = nsData as Data
return data.split(separator: 0).flatMap { String(bytes: $0, encoding: .utf8) }
}