Swift 来自 base64 编码字符串的 NSData returns 无

Swift NSData from base64encoded string returns nil

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

println(NSData(base64EncodedString: imageString, options: NSDataBase64DecodingOptions(0)))

输出为

nil
nil
nil
nil
nil
nil

每收到一张图片。

我也试过了

println(NSData(base64EncodedString: imageString, options: nil))

和相同的结果。一路上我有什么想念的吗?我会把图像串起来,但它们非常长...

尝试使用 IgnoreUnknownCharacters 选项。

或者尝试使用 NSDataAdditions

中的 initWithBase64EncodedString

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

在此处查看此 Whosebug 答案:

如果输入是所谓的 "URL Safe" Base64 数据,也会发生这种情况。此数据将 + 符号替换为 - 符号,将 / 符号替换为 _ 符号。

幸运的是转换它很简单:

inputString = [[inputString stringByReplacingOccurrencesOfString:@"-" withString:@"+"] stringByReplacingOccurrencesOfString:@"_" withString:@"/"];

一个full list of variants is available on Wikipedia

根据 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
    }
}

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

let baseEncodeText = "(.....)" //your base64 encoded string
let data = try Data.decodeUrlSafeBase64(baseEncodeText)