【问题标题】:Decode nsData to String Array将 nsData 解码为字符串数组
【发布时间】:2017-04-13 19:10:40
【问题描述】:

我想将我的 nsData 解码为字符串数组。我现在有这个代码:

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&lt;UInt8&gt;(buffer)

无法使用“UnsafePointer”类型调用初始化程序 '(UnsafeRawPointer)' 类型的参数列表

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

【问题讨论】:

    标签: swift


    【解决方案1】:

    enumerateBytes() 闭包中的bufferUnsafeRawPointer 你必须将它“重新绑定”到 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) }
    }
    

    这是如何工作的?

    • DataUInt8Sequence,因此
    • 可以在上面调用split(separator: 0),返回一个数组 “数据切片”(是对源数据的视图,而不是副本)。
    • 每个“数据切片”又是UInt8Sequence,其中一个 String 可以用String(bytes: $0, encoding: .utf8) 创建。 这是一个可失败的初始化程序(因为数据可能是无效的 UTF-8)。
    • flatMap { ... } 返回一个包含所有非零结果的数组, 即一个包含所有可以创建的字符串的数组 零字节之间的有效 UTF-8 代码序列。

    【讨论】:

    • 在 Swift 3 中我更喜欢签名 func stringArray(from nsData: NSData) ;-)
    • @vadian:确实!或者func stringArray(from data: Data),如果可能的话。 – 我保留了这个名字,以便 OP 可以直接用他/她的代码对其进行测试。
    • 我们不需要谈论滥用过时的NS... Swift 3 中的基础类...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    • 2017-01-05
    • 2012-07-07
    • 2018-06-25
    • 2011-09-19
    • 1970-01-01
    • 2014-11-01
    相关资源
    最近更新 更多