无法在 Swift 5 中解码 base64 字符串

时间:2021-03-19 22:37:30

标签: ios swift

我从第三方正在开发的应用程序的 API 中收到一些 base64 字符串。 base64 字符串是 HTML 内容编码并通过 API 传递。但是我无法在使用 Swift 5 版本语言的 iOS 应用程序中进行解码。 以下是我的 Playground 测试的片段:

import UIKit

let base64 = "PHA779779LTwvcD4KPHRhYmxlIGlkPSJwb3Ryb1RlbXBsYXRlV3JhcHBlciIgc3R5bGU9IndpZHRoOiAxMDAlOyIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPHRib2R5Pgo8dHICjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyIgY29sc3Bhbj0iMyIPHNwYW4gc3R5bGU9ImRpc3BsYXk6IGJsb2NrOyB3aWR0aDogNTBweDsgbWF4LXdpZHRoOiA1MHB4OyBtYXJnaW46IDBweCBhdXRvOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjNDE0MTQxOyIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj48aW1nIGNsYXNzPSJvZmZpY2VfbG9nbyIgc3JjPSJodHRwczovL2kuaW1ndXIuY29tL3hhTjdKV2wucG5nIiBhbHQ9ImxvZ28iIHdpZHRoPSI1MCIPC9zcGFuPjwvdGQCjwvdHICjx0cj4KPHRkIGNvbHNwYW49IjMiPgo8dGFibGUgc3R5bGU9IndpZHRoOiAxMDAlOyBtYXJnaW4tdG9wOiAxNXB4OyIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPHRib2R5Pgo8dHICjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogMjUlOyIgdmFsaWduPSJ0b3AiPiZuYnNwOzwvdGQCjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogNTAlOyIgdmFsaWduPSJ0b3AiPgo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IHdpZHRoOiAzNTBweDsgbWFyZ2luOiAwIGF1dG87Ij4KPHAgY2xhc3M9IiB3cml0ZV9oZXJlIiBzdHlsZT0ibGluZS1oZWlnaHQ6IGluaXRpYWw7IG1hcmdpbjogMDsiIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSI4KaX4Kaj4Kaq4KeN4Kaw4Kac4Ka4Kak4Kao4KeN4Kak4KeN4Kaw4KeAIOCmrOCmvuCmguCmsuCmvuCmpuCnhCmtiDgprjgprDgppXgpr7gprA8L3ACjxwIGNsYXNzPSJtaW5pc3RyeV9uYW1lIHdyaXRlX2hlcmUiIHN0eWxlPSJsaW5lLWhlaWdodDogaW5pdGlhbDsgbWFyZ2luOiAwOyIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj7gpq7gpqjgp43gpqTgp43gprDgpqPgpr7gprLgp5_gp4fgprAg4Kao4Ka4KauIOCmsuCmvCmluCngeCmqDwvcD4KPHAgY2xhc3M9Im9mZmljZV9uYW1lIHdyaXRlX2hlcmUiIHN0eWxlPSJsaW5lLWhlaWdodDogaW5pdGlhbDsgbWFyZ2luOiAwOyIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj7gpoXgpqvgpr_gprjgp4fgprAg4Kao4Ka4KauIOCmsuCmvCmluCngeCmqDwvcD4KPHAgY2xhc3M9IiB3cml0ZV9oZXJlIiBzdHlsZT0ibGluZS1oZWlnaHQ6IGluaXRpYWw7IG1hcmdpbjogMDsiIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSILS0tLTwvcD4KPHAgY2xhc3M9IiB3cml0ZV9oZXJlIiBzdHlsZT0ibGluZS1oZWlnaHQ6IGluaXRpYWw7IG1hcmdpbjogMDsiIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSILS0tLTwvcD4KPC9kaXYCjwvdGQCjx0ZCBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyB3aWR0aDogMjUlOyIgdmFsaWduPSJ0b3AiPgo8cCBjbGFzcz0icmlnaHRfc2xvZ2FuIHdyaXRlX2hlcmUiIHN0eWxlPSJtYXJnaW46IDA7IiBjb250ZW50ZWRpdGFibGU9InRydWUiPuCmmCmrOCmvyDgpobgpqrgprLgp4vgpqEg4KaV4Kaw4KeB4KaoLyDgprngp4fgpqHgpr_gpoIg4Kay4Ka_4KaW4KeB4KaoPC9wPgo8cCBjbGFzcz0icG90cm9fcHJpb3JpdHlfdGV4dCB3cml0ZV9oZXJlIiBzdHlsZT0ibWFyZ2luOiAwOyIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj4tLS0tPC9wPgo8cCBjbGFzcz0icG90cm9fc2VjdXJpdHlfdGV4dCB3cml0ZV9oZXJlIiBzdHlsZT0ibWFyZ2luOiAwOyIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj4tLS0tPC9wPgo8L3RkPgo8L3RyPgo8L3Rib2R5Pgo8L3RhYmxlPgo8L3RkPgo8L3RyPgo8dHICjx0ZCBjb2xzcGFuPSIzIiB2YWxpZ249Im1pZGRsZSICjx0YWJsZSBzdHlsZT0id2lkdGg6IDEwMCU7IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgo8dGJvZHkCjx0cj4KPHRkIHZhbGlnbj0ibWlkZGxlIj4KPHRhYmxlIHN0eWxlPSJ3aWR0aDogMTAwJTsiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCICjx0Ym9keT4KPHRyPgo8dGQgc3R5bGU9IndpZHRoOiA4NXB4OyBjb2xvcjogIzQxNDE0MTsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiIHZhbGlnbj0idG9wIj48c3BhbiBjbGFzcz0iIHdyaXRlX2hlcmUiIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGNvbG9yOiAjNDE0MTQxOyIgY29udGVudGVkaXRhYmxlPSJmYWxzZSI4Ka44KeN4Kau4Ka4Kaw4KaVIOCmqOCmruCnjeCmrOCmsDo8L3NwYW4PC90ZD4KPHRkIHN0eWxlPSJjb2xvcjogIzQxNDE0MTsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiPiZuYnNwOzwvdGQCjwvdHICjwvdGJvZHkCjwvdGFibGUCjwvdGQCjx0ZCBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj4KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCICjx0Ym9keT4KPHRyPgo8dGQgdmFsaWduPSJtaWRkbGUiPjxzcGFuIGNsYXNzPSIgd3JpdGVfaGVyZSIgc3R5bGU9ImNvbG9yOiAjNDE0MTQxOyI4Kak4Ka4Kaw4Ka_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_gpongpqbgp43gpqbgp4fgprbgp43gpq8v4Kas4Kaw4KeN4Kaj4Kao4KaLi4uLi4uLi4uLi4uLi4uLi4uIOCmqOCmvCmsOCnjeCmpuCnhCmtuCmleCnjeCmsOCmruCnhyDgpoXgpqjgp4HgprDgp4vgpqcg4KaV4Kaw4KaIOCmueCmhCmsuClpDwvcD4KPGRpdiBzdHlsZT0iaGVpZ2h0OiAwLjNyZW07Ij4mbmJzcDs8L2Rpdj4KPHRhYmxlIHN0eWxlPSJ3aWR0aDogMTAwJTsiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCICjx0Ym9keT4KPHRyPgo8dGQgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj4KPHRhYmxlIHN0eWxlPSJ3aWR0aDogMTAwJTsiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCICjx0Ym9keT4KPHRyPgo8dGQgc3R5bGU9InBhZGRpbmc6IDA7IiBjb2xzcGFuPSIxIiBhbGlnbj0ibGVmdCIgdmFsaWduPSJ0b3AiPgo8dGFibGUgc3R5bGU9IndpZHRoOiAxMDAlOyIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIj4KPHRib2R5Pgo8dHICjx0ZCBjb2xzcGFuPSIxIj4KPGRpdiBpZD0ia2hvc2hyYVJlY2VpdmVyc0xpc3QiIGNsYXNzPSJraG9zaHJhX3JlY2VpdmVyX2xpc3Qgb3B0aW9uX3BsYWNlaG9sZGVyIiBzdHlsZT0ib3BhY2l0eTogMDsiPgo8cCBjbGFzcz0id3JpdGVfaGVyZSIgc3R5bGU9Im1hcmdpbjogMHB4OyBjb2xvcjogIzQxNDE0MTsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiPuCmrOCmvCmpOCmsOCmoyA6PC9wPgo8dWwgY2xhc3M9Imxpc3Qtc3R5bGUtYmVuZ2FsaSBsaXN0ZWRfaXRlbXMga2hvc2hyYV9yZWNlaXZlciIgc3R5bGU9InBhZGRpbmctbGVmdDogMDsgY291bnRlci1yZXNldDogc2VjdGlvbjsgbGlzdC1zdHlsZTogbm9uZTsiIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIgZGF0YS12aWV3ZXI9InJlY2VpdmVyIj4KPGxpIGNvbnRlbnRlZGl0YWJsZT0idHJ1ZSIPHNwYW4gY2xhc3M9InNlcmlhbG51bWJlciIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7IGNvbG9yOiAjNDE0MTQxOyIgY29udGVudGVkaXRhYmxlPSJ0cnVlIj4o4KenKTwvc3Bhbj48c3BhbiBjbGFzcz0iaXRlbV90ZXh0IiBzdHlsZT0iY29sb3I6ICM0MTQxNDE7IiBjb250ZW50ZWRpdGFibGU9InRydWUiPuCmhCmqOCmqCnjeCmsOCmvuCmuOCnjeCmnCnjeCmsOCmvuCmleCmmuCmvuCmsCDgpq7gp43gpq_gpr7gpqjgp4fgppzgpq7gp4fgpqjgp43gpp8g4KaP4KaV4KeN4Ka44Kaq4Ka4Kaw4KeN4KafLCDgpp_gp4fgppXgpqjgp4vgprLgppzgpr8sIOCmjCmuOCmquCmvuCmrCmvOCmvuCmsCDgpp_gp4Eg4KaH4Kao4KeL4Kat4KeH4KafICjgpo_gpp_gp4Hgp43gpobgpocpIOCmquCnjeCmsOCniCmlCnjeCmsOCmvuCmriBUZXN0PC9zcGFuPjwvbGkCjwvdWwCjwvZGl2Pgo8L3RkPgo8L3RyPgo8L3Rib2R5Pgo8L3RhYmxlPgo8L3RkPgo8dGQgYWxpZ249InJpZ2h0IiB2YWxpZ249InRvcCICjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgo8dGJvZHkCjx0cj4KPHRkIGNvbHNwYW49IjEiPgo8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij48c3BhbiBzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxNTBweDsgbWF4LXdpZHRoOiAxNTBweDsgbWFyZ2luOiAwcHggYXV0bzsgY29sb3I6ICM0MTQxNDE7IiBjb250ZW50ZWRpdGFibGU9ImZhbHNlIj48aW1nIGNsYXNzPSJraG9zaHJhX2FwcHJvdmVyX3NpZ25hdHVyZSIgc3JjPSJpbWcvc2lnbi0xLnBuZyIgYWx0PSJsb2dvIiB3aWR0aD0iMTUwIj48L3NwYW4CjxwIGNsYXNzPSJ3cml0ZV9oZXJlIGtob3NocmFfYXBwcm92ZXJfdGV4dCIgc3R5bGU9Im1hcmdpbjogMHB4OyBsaW5lLWhlaWdodDogaW5pdGlhbDsgY29sb3I6ICM0MTQxNDE7IiBjb250ZW50ZWRpdGFibGU9ImZhbHNlIj7gpq7gp4vgpoMg4Ka54Ka4Ka44Ka4Kao4KeB4Kac4KeN4Kac4Ka4Kau4Ka4KaoPC9wPgo8cCBjbGFzcz0id3JpdGVfaGVyZSBraG9zaHJhX2FwcHJvdmVyX2Rlc2lnbmF0aW9uIiBzdHlsZT0ibWFyZ2luOiAwcHg7IGxpbmUtaGVpZ2h0OiBpbml0aWFsOyBjb2xvcjogIzQxNDE0MTsiIGNvbnRlbnRlZGl0YWJsZT0iZmFsc2UiPuCmuOCmsuCnjeCmrCngeCmtuCmqCDgpobgprDgp43gppXgpr_gpp_gp4fgppXgp43gpp88L3ACjxwIGNsYXNzPSJ3cml0ZV9oZXJlIGtob3NocmFfYXBwcm92ZXJfcGhvbmUiIHN0eWxlPSJtYXJnaW46IDBweDsgbGluZS1oZWlnaHQ6IGluaXRpYWw7IGNvbG9yOiAjNDE0MTQxOyIgY29udGVudGVkaXRhYmxlPSJmYWxzZSI4KaF4Kao4KeB4Kau4KeL4Kam4Kao4KaV4Ka4Kaw4KeAIOCmqCniCmqDwvcD4KPHAgY2xhc3M9IndyaXRlX2hlcmUga2hvc2hyYV9hcHByb3Zlcl9lbWFpbCIgc3R5bGU9Im1hcmdpbjogMHB4OyBsaW5lLWhlaWdodDogaW5pdGlhbDsgY29sb3I6ICM0MTQxNDE7IiBjb250ZW50ZWRpdGFibGU9ImZhbHNlIj5taGFzYW4uYTJpQGdtYWlsLmNvbTwvcD4KPC9kaXYCjwhLS0gPGRpdiBpZD0ib251bW9kaG9uX2RhdGUiIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IG9wYWNpdHk6IDA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY29udGVudGVkaXRhYmxlPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7IGhlaWdodDogMjBweDsgcG9zaXRpb246IHJlbGF0aXZlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij48aW5wdXQgc3R5bGU9ImJvcmRlcjogbm9uZTsgZm9udC1zaXplOiAxNXB4OyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyByaWdodDogMHB4OyBoZWlnaHQ6IDIwcHg7IG9wYWNpdHk6IDA7IHotaW5kZXg6IDk5OTsiIHR5cGU9InRleHQiIGF1dG9jb21wbGV0ZT0ib2ZmIiBpZD0iYXBwcm92ZXJfcG90cm9fZGF0ZV9ibiIgdmFsdWU9IuCnqyDgppzgp43gpq_gp4jgprfgp43gpqAg4Ken4Keq4Keo4KetIj48L3NwYW4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxociBzdHlsZT0ibWFyZ2luOjA7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY29udGVudGVkaXRhYmxlPSJ0cnVlIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7IGhlaWdodDogMjBweDsgcG9zaXRpb246IHJlbGF0aXZlOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij48aW5wdXQgc3R5bGU9ImJvcmRlcjogbm9uZTsgZm9udC1zaXplOiAxNXB4OyB3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDBweDsgbGVmdDogMHB4OyByaWdodDogMHB4OyBoZWlnaHQ6IDIwcHg7IG9wYWNpdHk6IDA7IHotaW5kZXg6IDk5OTsiIHR5cGU9InRleHQiIGF1dG9jb21wbGV0ZT0ib2ZmIiBpZD0iYXBwcm92ZXJfcG90cm9fZGF0ZV9lbiIgdmFsdWU9IuCnpCnryDgpq7gp4cg4Keo4Kem4Keo4KemIj48L3NwYW4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXYIC0tPjwvdGQCjwvdHICjwvdGJvZHkCjwvdGFibGUCjwvdGQCjwvdHICjwvdGJvZHkCjwvdGFibGUCjwvdGQCjwvdHICjwvdGJvZHkCjwvdGFibGUCjxkaXYgc3R5bGU9ImhlaWdodDogMC4zcmVtOyIJm5ic3A7PC9kaXYCjxkaXYgaWQ9Imtob3NocmFBdHRlbnRpb25MaXN0IiBzdHlsZT0ib3BhY2l0eTogMDsiPjxzcGFuIGNsYXNzPSJ3cml0ZV9oZXJlIiBzdHlsZT0iZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNDE0MTQxOyIgY29udGVudGVkaXRhYmxlPSJmYWxzZSI4Kam4KeD4Ka34KeN4Kaf4Ka_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_gp4Hgprbgpqgg4KaG4Kaw4KeN4KaV4Ka_4Kaf4KeH4KaV4KeN4KafPC9wPgo8L2Rpdj4KPC90ZD4KPC90cj4KPC90Ym9keT4KPC90YWJsZT4KPC90ZD4KPC90cj4KPC90Ym9keT4KPC90YWJsZT4KPC90ZD4KPC90cj4KPC90Ym9keT4KPC90YWJsZT4KPHAKu_ve_vTwvcD4"


//let decodedData = Data(base64Encoded: base64, options:.ignoreUnknownCharacters)
//
//
//print(decodedData)

//let utf8str = base64.data(using: .utf8)
//let base64Encoded = utf8str?.base64EncodedString(options: Data.Base64EncodingOptions(rawValue: 0))
//let encodedString : String = base64Encoded!
//print(encodedString) // my encoded data

extension String {
    func urlSafeBase64Decoded() -> String? {
        var st = self
            .replacingOccurrences(of: "_", with: "/")
            .replacingOccurrences(of: "-", with: "+")
        let remainder = self.count % 4
        if remainder > 0 {
            st = self.padding(toLength: self.count + 4 - remainder,
                              withPad: "=",
                              startingAt: 0)
        }
        guard let d = Data(base64Encoded: st, options: .ignoreUnknownCharacters) else{
            return nil
        }
        return String(data: d, encoding: .utf8)
    }
}

print(base64.urlSafeBase64Decoded() ?? "* decoding failed*")

任何帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:0)

这条线有问题:

        st = self.padding(toLength: self.count + 4 - remainder,

你的意思

        st = st.padding(toLength: st.count + 4 - remainder,
             ^^                   ^^

(第二个实际上并不重要,但这种方式更一致。)您将字符串从 base64url 转换为 base64,然后将其丢弃并填充原始字符串。

也就是说,这仍然会返回 nil,因为它不是 UTF-8 编码的字符串。它包含一些 HTML 片段,但其中大部分是原始二进制数据:

00000000: 3c70 3bef defb f4b4 f0bd c0f8 28f1 d185  <p;.........(...
00000010: 89b1 9481 a590 f489 c1bd d1c9 bd51 95b5  .............Q..
00000020: c1b1 85d1 955d c985 c1c1 95c8 8881 cdd1  .....]..........
00000030: e5b1 94f4 89dd a591 d1a0 e880 c4c0 c094  ................
00000040: ec88 818d 95b1 b1cd c185 8da5 b99c f488  ................
00000050: c088 818d 95b1 b1c1 8591 91a5 b99c f488  ................
00000060: c088 f828 f1d1 89bd 91e4 f828 f1d1 c80a  ...(.......(....
00000070: 3c74 6420 7374 796c 653d 2274 6578 742d  <td style="text-
00000080: 616c 6967 6e3a 2063 656e 7465 723b 2220  align: center;"
00000090: 636f 6c73 7061 6e3d 2233 220f 1cdc 185b  colspan="3"....[

它可能被压缩了。否则,它可能是包装 HTML 的其他二进制格式。我没有立即认出它。

相关问题