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:@"/"];
根据 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)
我正在与 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:@"/"];
根据 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)