2015-09-10 3 views
4

Swift 1,2Swift 2 base64 кодирование дают различные результаты

let apiLoginString = NSString(format: "%@:%@", API_USERNAME, API_PASSWORD); 
    let apiLoginData: NSData = apiLoginString.dataUsingEncoding(NSUTF8StringEncoding)!; 
    var base64ApiLoginString = apiLoginData.base64EncodedStringWithOptions(nil); 

Свифта 2

let apiLoginString = NSString(format: "%@:%@", API_USERNAME, API_PASSWORD); 
    let apiLoginData: NSData = apiLoginString.dataUsingEncoding(NSUTF8StringEncoding)!; 
    var base64ApiLoginString = apiLoginData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()); 

Эти 2 дают разные результаты подход. В Swift 2 мы не можем перейти в nil;

apiLoginData.base64EncodedStringWithOptions(nil); 

Я также попытался прошел в NSDataBase64EncodingOptions.Encoding64CharacterLineLength в Swift 2. Но результаты все еще differemt

Любые мысли?

ОБНОВЛЕНИЕ 2: Это не проблема с Swift 1.2 или Swift 2. Как ни странно, эти 2 печатают разные результаты .. Что такое F !!

UPDATE 3: Оказывается, что, как Мартин отметил, у меня есть какой-то невидимый персонаж в моем API_USERNAME переменного

class RequestHelper: NSObject { 
static var API_USERNAME: NSString = "⁠⁠⁠abc"; 
static var API_PASSWORD: NSString = "123"; 
static var USERNAME: NSString = "abc" 
static var PASSWORD: NSString = "123" 


class func signUpUser() { 
    //Base64 
    var loginString = NSString(format: "%@:%@", USERNAME, PASSWORD); 
    var loginData: NSData = loginString.dataUsingEncoding(NSUTF8StringEncoding)!; 
    var base64LoginString = loginData.base64EncodedStringWithOptions([]); 

    print("BASE 64 \(base64LoginString)");//RESULT YWJjOjEyMw== 

    let apiLoginString = NSString(format: "%@:%@", API_USERNAME, API_PASSWORD); 
    let apiLoginData: NSData = apiLoginString.dataUsingEncoding(NSUTF8StringEncoding)!; 
    var base64ApiLoginString = apiLoginData.base64EncodedStringWithOptions([]); 

    print("BASE 64 \(base64ApiLoginString)");// RESULT IS 4oGg4oGg4oGgYWJjOjEyMw== 
    } 
+0

дополнительную часть во второй кодированной строки (4oGg4oGg4oGg) буквально NIL при декодировании. не знаю, почему Foundation добавляет такую ​​бесполезную голову. – Mousavian

+0

Я рекомендую использовать собственный тип String и строчную интерполяцию вместо форматирования NSString. – Mousavian

ответ

8

Точно так же, как и в Swift 2.0 calendar components error или Swift 2.0 - Binary Operator "|" cannot be applied to two UIUserNotificationType operands,
NSDataBase64EncodingOptions в Swift 2 OptionSetType . Он предлагает наборный интерфейс и может быть инициализирован из массива literal.

Так допустимые варианты будут, например:

base64EncodedStringWithOptions([]) // no options 
base64EncodedStringWithOptions([.Encoding64CharacterLineLength]) 
base64EncodedStringWithOptions([.Encoding64CharacterLineLength, .EncodingEndLineWithCarriageReturn]) 

Полный пример:

let apiLoginString = NSString(format: "%@:%@", "user", "password") 
let apiLoginData = apiLoginString.dataUsingEncoding(NSUTF8StringEncoding)! 
let base64ApiLoginString = apiLoginData.base64EncodedStringWithOptions([]) 

print(base64ApiLoginString) 
// dXNlcjpwYXNzd29yZA== 
+0

Да, но, как ни странно, результат закодированной строки совершенно другой. Есть предположения? – JayVDiyk

+0

@JayVDiyk: Я не могу воспроизвести это. Я добавил полный пример (Swift 2) к ответу, и я получаю точно такой же результат для Swift 1.2. –

+0

, пожалуйста, проверьте мой обновленный вопрос, это странно. или я что-то пропустил? – JayVDiyk

Смежные вопросы