Swift中从base64编码的字符串返回NSData返回nil

9

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

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

输出结果为:
nil
nil
nil
nil
nil
nil

每个收到的图像都需要一个。
我也尝试过。
println(NSData(base64EncodedString: imageString, options: nil))

同样的结果。我是否漏掉了什么??我会放置图像字符串,但它们非常长...


你能分享一下你正在处理的图像的base64字符串吗?这样,我们就可以更容易地确定故障点了。 - Clay McIlrath
4个回答

21

11

尝试使用 IgnoreUnknownCharacters 选项。

或者尝试使用NSDataAdditions中的 initWithBase64EncodedString 方法。


忽略未知字符选项解决了问题!谢谢!有什么建议是错在哪里吗? - Freestyle076
也许你的字符串中有前导或尾随空格,或者一些不可见字符。 - Mark Pervovskiy
哦,是的,在我们的应用程序中很可能会出现这种情况。就是这样了。谢谢! - Freestyle076

4

基于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)

1
很抱歉听到这个消息,我在我的应用程序中使用这段代码,它运行良好,所以也许是你的Base64字符串格式不正确,你可以在线检查它,例如 https://www.base64decode.org/。 - Maciej Gad
是的,你说得对。实际上,我的base64字符串包含了header.payload.signature,这在创建Data(...)时会失败。所以如果我只提取payload部分,那么它就可以工作了 :-) - StackUnderflow

4

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

幸运的是,转换很简单:

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

完整的变体列表可在维基百科上找到。(链接)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接