我正在尝试使用以下代码将base64字符串解码为Swift中的图像:
let decodedData=NSData(base64EncodedString: encodedImageData, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
不幸的是,变量codedData的值为nil
通过代码调试,我验证了变量encodedImageData不是nil并且是正确的编码图像数据(通过使用在线base64到图像转换器进行验证)。可能是我的问题背后的原因是什么?
答案 0 :(得分:32)
此方法需要填充“=”,字符串的长度必须是4的倍数。
在base64的一些实现中,解码不需要填充字符,因为可以计算丢失字节的数量。但在Fundation的实施中,这是强制性的。
<强>更新强> 正如评论中所指出的,最好首先检查字符串长度是否为4的倍数。如果 encoded64 具有你的base64字符串并且它不是常量,你可以这样做:
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)
}
Swift 4
let remainder = encoded64.count % 4
if remainder > 0 {
encoded64 = encoded64.padding(toLength: encoded64.count + 4 - remainder,
withPad: "=",
startingAt: 0)
}
更新了一行版本:
或者你可以使用这个单行版本,当它的长度已经是4的倍数时返回相同的字符串:
encoded64.padding(toLength: ((encoded64.count+3)/4)*4,
withPad: "=",
startingAt: 0)
答案 1 :(得分:5)
当字符数可被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)
}
}
答案 2 :(得分:2)
(斯威夫特3) 我一直在这种情况下,当我使用这一行时,尝试使用base64编码的字符串获取数据时返回nil
let imageData = Data(base64Encoded: strBase64, options: .ignoreUnknownCharacters)
尝试填充字符串并且也没有成功
这对我有用
func imageForBase64String(_ strBase64: String) -> UIImage? {
do{
let imageData = try Data(contentsOf: URL(string: strBase64)!)
let image = UIImage(data: imageData)
return image!
}
catch{
return nil
}
}
答案 3 :(得分:1)
这对我有帮助:
extension String {
func fromBase64() -> String? {
guard let data = Data(base64Encoded: self.replacingOccurrences(of: "_", with: "="), options: Data.Base64DecodingOptions(rawValue: 0)) else {
return nil
}
return String(data: data, encoding: .utf8)
}
}
用法:
print(base64EncodedString.fromBase64())
答案 4 :(得分:0)
另一个单行版本:
let length = encoded64.characters.count
encoded64 = encoded64.padding(toLength: length + (4 - length % 4) % 4, withPad: "=", startingAt: 0)
答案 5 :(得分:0)
检查您的decodedData变量的内容,并查找此前缀“ data:image / png; base64”,我遇到了这个问题,并注意到我的String base64具有这样的前缀,因此我使用了这种方法,它起作用了< / p>
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Me.Range("M:M")) Is Nothing Then
Intersect(Target, Me.Range("M:M")).Offset(, 1).Resize(, 7).ClearContents
End If
End Sub
}
答案 6 :(得分:0)
使用特殊字符会出现问题,但是有趣的一点是,如果我们使用 NSData 和 NSString ,那么它可以正常工作。
function hello2(type: 'type1' | 'type2') {
return { type, index: 3 } as T1A | T2A | T1B | T2B
}