base64encoded字符串中的Swift NSData返回nil

Fre*_*076 3 base64 nsdata swift

我在Swift中与服务器通信,检索图像数据.传入的数据被编码为base64字符串.我能够正确接收和显示编码的字符串.当我去使用NSData该类将字符串解码回二进制数据并显示...

println(NSData(base64EncodedString: imageString, options: NSDataBase64DecodingOptions(0)))
Run Code Online (Sandbox Code Playgroud)

输出是

nil
nil
nil
nil
nil
nil
Run Code Online (Sandbox Code Playgroud)

每个收到的图像一个.

我也试过了

println(NSData(base64EncodedString: imageString, options: nil))
Run Code Online (Sandbox Code Playgroud)

和相同的结果.沿路有什么我想念的吗?我会把图像串放好但是它们很长......

Bar*_*ker 8

对于可能遇到此问题的其他人,请确保您的Base64编码字符串的长度可被4整除(=应该用于填充长度).

请参阅此处的StackOverflow答案:https://stackoverflow.com/a/36366421/330494


小智 5

尝试使用IgnoreUnknownCharacters选项.

或者尝试使用NSDataAdditions中的 initWithBase64EncodedString


baz*_*l87 5

根据 Frank Schmitt 和 Barlow Tucker 的答案,我创建了一个扩展来Data更好地处理 base64 编码:

extension Data {
    static func decodeUrlSafeBase64(_ value: String) throws -> Data {
        var stringtoDecode: String = value.replacingOccurrences(of: "-", with: "+")
        stringtoDecode = stringtoDecode.replacingOccurrences(of: "_", with: "/")
        switch (stringtoDecode.utf8.count % 4) {
            case 2:
                stringtoDecode += "=="
            case 3:
                stringtoDecode += "="
            default:
                break
        }
        guard let data = Data(base64Encoded: stringtoDecode, options: [.ignoreUnknownCharacters]) else {
            throw NSError(domain: "decodeUrlSafeBase64", code: 1,
                        userInfo: [NSLocalizedDescriptionKey: "Can't decode base64 string"])
        }
        return data
    }
}
Run Code Online (Sandbox Code Playgroud)

所以在你的代码中,你可以像这样使用它:

let baseEncodeText = "(.....)" //your base64 encoded string
let data = try Data.decodeUrlSafeBase64(baseEncodeText)
Run Code Online (Sandbox Code Playgroud)