我正在与Swift中的服务器通信,检索图像数据。传入的数据被编码为base64字符串。我能够正确接收和显示编码的字符串。当我使用NSData
类将字符串解码回二进制数据并显示...
println(NSData(base64EncodedString: imageString, options: NSDataBase64DecodingOptions(0)))
输出
nil
nil
nil
nil
nil
nil
每个收到的图像一个。
我也试过
println(NSData(base64EncodedString: imageString, options: nil))
和相同的结果。沿路有什么我想念的吗?我会把图像串放好但是它们很长......
答案 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:@"/"];
答案 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)