【问题标题】:Swift NSData from base64encoded string returns nil来自 base64encoded 字符串的 Swift NSData 返回 nil
【发布时间】:2015-03-13 07:40:45
【问题描述】:

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

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

输出是

nil
nil
nil
nil
nil
nil

每收到一张图片。

我也试过

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

和相同的结果。一路上我有什么遗漏吗?我会把图像字符串放在上面,但它们很长......

【问题讨论】:

  • 你能分享你正在使用的图像的 base64 字符串吗?这样告诉你故障点在哪里会容易得多。

标签: swift base64 nsdata


【解决方案1】:

尝试使用 IgnoreUnknownCharacters 选项。

或者尝试使用NSDataAdditions中的initWithBase64EncodedString

【讨论】:

  • IgnoreUnknownCharacters 选项成功了!谢谢!关于哪里出了问题的任何提示?
  • 也许你的字符串中有前导或尾随空格或一些不可见的字符。
  • 哦,是的,在我们的应用程序中很可能。一定是这样的。谢谢!
【解决方案2】:

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

在此处查看此 StackOverflow 答案:https://stackoverflow.com/a/36366421/330494

【讨论】:

  • 保存了我的一天后缀。谢谢。
【解决方案3】:

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

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

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

full list of variants is available on Wikipedia

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 很抱歉,我在我的应用程序中使用了这个代码,它工作正常,所以可能你的 Base64 字符串格式不正确,你可以在线检查它,即base64decode.org
    • 是的,你是对的,或者,实际上,我的 base64 字符串有一个 header.payload.signature,它在创建 Data(...) 时失败所以如果我只是提取有效负载部分,那么它就可以工作:-)
    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 2018-04-20
    • 2015-12-10
    • 2016-10-19
    • 1970-01-01
    • 2015-02-25
    • 2016-01-12
    相关资源
    最近更新 更多