swift base64解码返回nil
我正在尝试使用下面的代码在swift中将base64string解码为图像:
let decodedData=NSData(base64EncodedString: encodedImageData, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
不幸的是,variablescodedData的值为零
通过代码debugging,我validation了variablesencodedImageData不是零,并且是正确的编码图像数据(通过使用在线base64到图像转换器validation)。 可能是我的问题背后的原因是什么?
注意:我还是Swift和XCode的新手
谢谢
这个方法需要填充“=”,string的长度必须是4的倍数。
在base64的一些实现中,填充字符不需要解码,因为可以计算丢失字节的数量。 但在Fundation的实施中,这是强制性的。
更新:如注释所述,最好先检查string长度是否已经是4的倍数。如果encoded64具有base64string并且它不是常量,那么可以这样做:
Swift 2
let remainder = encoded64.characters.count % 4 if remainder > 0 { encoded64 = encoded64.stringByPaddingToLength(encoded64.characters.count + 4 - remainder, withPad: "=", startingAt: 0) }
Swift 3
let remainder = encoded64.characters.count % 4 if remainder > 0 { encoded64 = encoded64.padding(toLength: encoded64.characters.count + 4 - remainder, withPad: "=", startingAt: 0) }
更新一行版本:
或者你可以使用这个一行版本,当它的长度已经是4的倍数时,它返回相同的string:
encoded64.padding(toLength: ((encoded64.characters.count+3)/4)*4, withPad: "=", startingAt: 0)
当字符数可以被4整除时,你需要避免填充。
private func base64PaddingWithEqual(encoded64: String) -> String { let remainder = encoded64.characters.count % 4 if remainder == 0 { return encoded64 } else { // padding with equal let newLength = encoded64.characters.count + (4 - remainder) return encoded64.stringByPaddingToLength(newLength, withString: "=", startingAtIndex: 0) } }
(Swift 3)我一直在这种情况下,试图获取数据使用base64编码的string返回零与我时,我用这条线
let imageData = Data(base64Encoded: strBase64, options: .ignoreUnknownCharacters)
尝试填充string,并没有工作了
这是我的工作
func imageForBase64String(_ strBase64: String) -> UIImage? { do{ let imageData = try Data(contentsOf: URL(string: strBase64)!) let image = UIImage(data: imageData) return image! } catch{ return nil } }
另一个单行版本:
let length = encoded64.characters.count encoded64 = encoded64.padding(toLength: length + (4 - length % 4) % 4, withPad: "=", startingAt: 0)