4

Swift 1.2

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

Swift 2

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

Those 2 approach yield different results. In Swift 2 we cannot pass in nil anymore;

apiLoginData.base64EncodedStringWithOptions(nil);

I have also tried passed in NSDataBase64EncodingOptions.Encoding64CharacterLineLength in Swift 2. But the results is still differemt

Any thoughts?

UPDATE 2: It is not the problem with Swift 1.2 or Swift 2. Oddly enough those 2 prints out different results.. What the F!!

UPDATE 3: Turns out that as Martin pointed out, I have some invisible character in my API_USERNAME variable

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==
}
Kerberos
  • 4,036
  • 3
  • 36
  • 55
JayVDiyk
  • 4,277
  • 22
  • 70
  • 135
  • extra part in second encoded string (4oGg4oGg4oGg) is literally nil when decoded. don't know why Foundation add such useless head – Mousavian Sep 10 '15 at 12:19
  • I recommend you use native String type and string interpolation instead of NSString formatter. – Mousavian Sep 10 '15 at 12:21

1 Answers1

8

Similarly as in Swift 2.0 calendar components error or Swift 2.0 - Binary Operator "|" cannot be applied to two UIUserNotificationType operands,
NSDataBase64EncodingOptions is an OptionSetType in Swift 2. It offers a set-like interface and can be initialized from an array literal.

So valid options would be for example:

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

Full example:

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

print(base64ApiLoginString)
// dXNlcjpwYXNzd29yZA==
Community
  • 1
  • 1
Martin R
  • 529,903
  • 94
  • 1,240
  • 1,382
  • Yes, but oddly enough, the result of the encoded string is totally different. Any thoughts? – JayVDiyk Sep 10 '15 at 11:20
  • @JayVDiyk: I cannot reproduce that. I have added a full (Swift 2) example to the answer, and I get exactly the same output for Swift 1.2. – Martin R Sep 10 '15 at 11:37
  • please check my updated question, this is weird. or am i missing something? – JayVDiyk Sep 10 '15 at 11:55
  • I have officially lost my mind. Please try that out if it behaves the same on your place. – JayVDiyk Sep 10 '15 at 12:00
  • 1
    @JayVDiyk: Your API_USERNAME has some invisible characters right at the start, before the letter "a". If you remove those (or rewrite the string) you get identical results! – Martin R Sep 10 '15 at 12:13