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)