base64encoded字符串中的Swift NSData返回nil

时间:2015-01-14 23:41:11

标签: swift base64 nsdata

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

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

输出

nil
nil
nil
nil
nil
nil

每个收到的图像一个。

我也试过

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

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

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

尝试使用IgnoreUnknownCharacters选项。

或尝试使用NSDataAdditions

中的initWithBase64EncodedString

答案 2 :(得分:0)

如果输入是所谓的" URL Safe" Base64数据。此数据的+符号替换为-符号,/符号替换为_符号。

幸运的是,转换它很简单:

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

A full list of variants is available on Wikipedia

答案 3 :(得分:0)

根据弗兰克·施密特(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)