Быстрое добавление заполнения к строке Base64 возвращает меньшую строку - PullRequest
0 голосов
/ 06 января 2020

У меня есть изображение, которое я преобразовал в 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

Обновление:

Я удалил опцию lineLength64Characters, которая, похоже, устранила проблему, но я не уверен, почему. Я заметил, что все фотографии теперь возвращаются как кратные 4, так что это может быть частью этого. Спасибо за помощь пользователям ниже.

1 Ответ

0 голосов
/ 06 января 2020

Вам не нужно ничего дополнять вручную , просто добавьте параметр ignoreUnknownCharacters

if let imageData = Data(base64Encoded: strBase64, options: .ignoreUnknownCharacters) { ...

Или декодируйте данные без параметров и пропустите параметр lineLength64Characters при кодировании данные

return imageData.base64EncodedString()

и удаление

  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)
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...