Swift base64解码返回nil

时间:2016-04-01 19:23:48

标签: ios swift uiimage base64 decode

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

let decodedData=NSData(base64EncodedString: encodedImageData, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)

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

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

7 个答案:

答案 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
}