Swift 向Base64字符串添加填充将返回较小的字符串

Swift 向Base64字符串添加填充将返回较小的字符串,swift,base64,Swift,Base64,我有一个转换成base64的图像,当我尝试解码时失败了,因为它不能被4整除。我添加了代码来检查这一点,并适当地添加了填充。这段代码适用于我测试的较小字符串,但当使用较大的字符串时,它实际上返回一个较小的字符串,包含的字符数减少了数百个 我使用它进行图像处理,因此字符串是base64编码的图像 imageView = imageButton.backgroundImage(for: UIControl.State.normal) if var strBase64 = imageVi

我有一个转换成base64的图像,当我尝试解码时失败了,因为它不能被4整除。我添加了代码来检查这一点,并适当地添加了填充。这段代码适用于我测试的较小字符串,但当使用较大的字符串时,它实际上返回一个较小的字符串,包含的字符数减少了数百个

我使用它进行图像处理,因此字符串是base64编码的图像

    imageView = imageButton.backgroundImage(for: UIControl.State.normal)
    if var strBase64 = imageView.toBase64() {
        print("char count 1 ", strBase64.count)
        let remainder = strBase64.count % 4
        if remainder > 0 {
            print("remainder is greater than zero = ", remainder)
            print("char count 2 ", strBase64.count)
            let strBase64 = strBase64.padding(toLength: strBase64.count + 4 - remainder, withPad: "=", startingAt: 0)
            print("char count 3 ", strBase64.count)
        }

        if let imageData = Data(base64Encoded: strBase64) {
            if let decodedimage = UIImage(data: imageData) {
                print("unwrapped")
            }
        } else {
            print("failed")
        }
    }

extension UIImage{
    func toBase64() -> String? {
        guard let imageData = self.jpegData(compressionQuality: 0.2) else { return nil }
        return imageData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength64Characters)
    }
}
输出:

char count 1  42054
remainder is greater than zero =  2
char count 2  42054
char count 3  41419
failed
更新:


我删除了LineLength64字符的选项,这似乎解决了这个问题,但我不知道为什么。我注意到所有图片现在都以4的倍数返回,所以这可能是它的一部分。感谢您对下面用户的帮助。

您不需要手动填充任何内容,只需添加
忽略未知字符
选项即可

if let imageData = Data(base64Encoded: strBase64, options: .ignoreUnknownCharacters) { ...
或者不带选项解码数据,并在编码数据时省略
linelength64字符
选项

return imageData.base64EncodedString()
删除


请提供一个实际的测试示例。我不相信正确转换为base64的图像不会转换回图像数据。问题更可能出现在您上传/下载数据的方式上。显示您的整个链,也许提供一个示例图像?我不是下载或上传数据,只是将编码数据存储到字符串中,稍后尝试解码。当base64数据可以被4整除并且不需要填充时,它可以工作,否则它将失败。酷,你能提供一个编码和解码的示例图像和示例代码吗?换句话说,复制基本问题所需的一切。谢谢。好的,我在这里更新代码来显示编码和解码。我使用的图像是默认的iPhone模拟器图像之一,第一张黄色的花图片。如果我知道如何上传,我会上传到这里。请注意,填充字符串被分配给一个局部变量
strBase64
,其范围限制为
if rem余数>0{…}
块。因此,
decodedimage
仍然是从原始的未添加的Base64字符串构造的。
  print("char count 1 ", strBase64.count)
    let remainder = strBase64.count % 4
    if remainder > 0 {
        print("remainder is greater than zero = ", remainder)
        print("char count 2 ", strBase64.count)
        let strBase64 = strBase64.padding(toLength: strBase64.count + 4 - remainder, withPad: "=", startingAt: 0)
        print("char count 3 ", strBase64.count)
    }