Как я могу декодировать строки с кодировкой base64, которые не заканчиваются знаком равенства в Swift? [Дубликат]

7
задан andrew nguyen 19 March 2015 в 19:50
поделиться

3 ответа

eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0

не является допустимой строкой в ​​кодировке Base64, потому что ее длина не кратная 4. Некоторые декодеры Base64 допускают эту ошибку, но методы NSData этого не делают.

Итак, это на самом деле ошибка на стороне сервера, создающая строчную кодировку Base64. Если это необходимо, вы можете исправить его в своем приложении, добавив требуемое дополнение с символами = (код обновлен для Swift 2):

var base64String = arr[1] as String
if base64String.characters.count % 4 != 0 {
    let padlen = 4 - base64String.characters.count % 4
    base64String += String(count: padlen, repeatedValue: Character("="))
}

И теперь декодирование работает как ожидалось:

if let data = NSData(base64EncodedString: base64String, options: []),
    let str = String(data: data, encoding: NSUTF8StringEncoding) {
    print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"}
}

Swift 4:

var base64String = "eyJleHAiOjE0MjY4MjIxNjMsImlkIjoiNTUwYjA3NzM4ODk1NjAwZTk5MDAwMDAxIn0"

if base64String.count % 4 != 0 {
    let padlen = 4 - base64String.count % 4
    base64String.append(contentsOf: repeatElement("=", count: padlen))
}

if let data = Data(base64Encoded: base64String) ,
    let str = String(data: data, encoding: .utf8) {
    print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"}
}
15
ответ дан Martin R 24 August 2018 в 07:51
поделиться

Swift 4, как показано ниже:

if let data = Data(base64Encoded: base64String, options: []),
        let str = String(data: data as Data, encoding: String.Encoding.utf8) {
        print(str) // {"exp":1426822163,"id":"550b07738895600e99000001"}
    }
-1
ответ дан Dimple Shah 24 August 2018 в 07:51
поделиться

Выше решение работает для меня, я преобразован в swift3

Здесь вы можете найти код swift3

var base64Str = arr[1] as String
if base64Str.characters.count % 4 != 0 {
    let padlen = 4 - base64Str.characters.count % 4      
    base64Str += String(repeating: "=", count: padlen)
}

if let data = Data(base64Encoded: base64Str, options: []),
    let str = String(data: data, encoding: String.Encoding.utf8) {
        print(str)
}
4
ответ дан Raju Abe 24 August 2018 в 07:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: