Базовое декодирование для Mac OS с использованием Swift [duplicate]

Я нашел, что это работает довольно хорошо:

^\(*\+*[1-9]{0,3}\)*-*[1-9]{0,3}[-. /]*\(*[2-9]\d{2}\)*[-. /]*\d{3}[-. /]*\d{4} *e*x*t*\.* *\d{0,4}$

Он работает для этих форматов:

1-234-567-8901
1-234-567-8901 x1234
1-234-567-8901 ext1234
1 (234) 567-8901
1.234.567.8901
1/234/567/8901
12345678901
1-234-567-8901 ext. 1234
(+351) 282 433 5050

Обязательно используйте глобальные и многострочные флаги, чтобы убедиться.

Ссылка: http://www.regexr.com/3bp4b

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 20 August 2018 в 22:33
поделиться
  • 1
    где точно должны быть записаны токены в качестве лучшей практики? Я думал, что он должен храниться в цепочке ключей вместе с именем пользователя и паролем. – user805981 28 March 2015 в 16:14
  • 2
    @ user805981: Я действительно ничего не знаю о токенах jwt. Но да, конфиденциальные данные, такие как пароли, должны храниться в Keychain. – Martin R 28 March 2015 в 16:22
  • 3
    Благодарю. Что касается брелок. Сколько словарей для ключей есть брелок, способный хранить для каждого приложения? Это бесконечное или одно ключевое слово для каждого приложения? – user805981 28 March 2015 в 16:38

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 20 August 2018 в 22:33
поделиться
  • 1
    В Swift 4 лучше использовать данные, чем NSData (и лучше использовать данные, чем для передачи NSData в Data). И в любом случае , обновление для Swift 3+ уже было дано @ raju-abe в их ответе. Не отправляйте дубликат / неполный контент. – Moritz 18 December 2017 в 13:22

Выше решение работает для меня, я преобразован в 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 20 August 2018 в 22:33
поделиться
Другие вопросы по тегам:

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