Swift base64解码返回nil

red*_*rem 13 base64 decode uiimage ios swift

我正在尝试使用以下代码将base64字符串解码为Swift中的图像:

let decodedData=NSData(base64EncodedString: encodedImageData, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)
Run Code Online (Sandbox Code Playgroud)

不幸的是,变量codedData的值为nil

通过代码调试,我验证了变量encodedImageData不是nil并且是正确的编码图像数据(通过使用在线base64到图像转换器进行验证).可能是我的问题背后的原因是什么?

jla*_*rra 35

此方法需要填充"=",字符串的长度必须是4的倍数.

在base64的一些实现中,解码不需要填充字符,因为可以计算丢失字节的数量.但在Fundation的实施中,它是强制性的.

更新: 如评论中所述,最好首先检查字符串长度是否为4的倍数.如果encoded64具有您的base64字符串并且它不是常量,您可以执行以下操作:

斯威夫特2

let remainder = encoded64.characters.count % 4
if remainder > 0 {
    encoded64 = encoded64.stringByPaddingToLength(encoded64.characters.count + 4 - remainder,
                                                  withPad: "=",
                                                  startingAt: 0)
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特3

let remainder = encoded64.characters.count % 4
if remainder > 0 {
    encoded64 = encoded64.padding(toLength: encoded64.characters.count + 4 - remainder,
                                  withPad: "=",
                                  startingAt: 0)
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特4

let remainder = encoded64.count % 4
if remainder > 0 {
    encoded64 = encoded64.padding(toLength: encoded64.count + 4 - remainder,
                                  withPad: "=",
                                  startingAt: 0)
}
Run Code Online (Sandbox Code Playgroud)

更新了一行版本:

或者您可以使用这一行版本,当其长度已经是4的倍数时返回相同的字符串:

encoded64.padding(toLength: ((encoded64.count+3)/4)*4,
                  withPad: "=",
                  startingAt: 0)
Run Code Online (Sandbox Code Playgroud)


小智 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)
  }
}
Run Code Online (Sandbox Code Playgroud)