将nsData解码为String Array

时间:2017-04-13 19:10:40

标签: swift

我想将nsData解码为String Array。我现在有这个代码:

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
        }

但是我在这一行收到错误:let bytes = UnsafePointer<UInt8>(buffer)

  

无法为类型&#39; UnsafePointer&#39;调用初始化程序。与   类型&#39;(UnsafeRawPointer)&#39;

的参数列表

我是否需要将缓冲区转换为UnsafePointer?如果是这样,我该怎么做?

1 个答案:

答案 0 :(得分:2)

buffer关闭中的

enumerateBytes()UnsafeRawPointer 你必须&#34;重新绑定&#34;它在Swift 3中的UInt8指针:

// let bytes = UnsafePointer<UInt8>(buffer)
let bytes = buffer.assumingMemoryBound(to: UInt8.self)

但为什么这么复杂?您可以使用

获得相同的结果
func nsDataToStringArray(nsData: NSData) -> [String] {
    let data = nsData as Data
    return data.split(separator: 0).flatMap { String(bytes: $0, encoding: .utf8) }
}

这是如何运作的?

  • DataSequence的{​​{1}},因此
  • 可以在它上面调用
  • UInt8,返回一个数组 &#34;数据切片&#34; (这是对源数据的看法,而不是副本)。
  • 每个&#34;数据切片&#34;又是split(separator: 0) Sequence的{​​{1}} 可以使用UInt8创建String。 这是一个可用的初始化程序(因为数据可能是无效的UTF-8)。
  • String(bytes: $0, encoding: .utf8)返回一个包含所有非零结果的数组, 即一个包含所有字符串的数组,可以从中创建 零字节之间的有效UTF-8代码序列。