Swift 2 base64编码产生不同的结果

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());

这两种方法产生不同的结果。在Swift 2中,我们不能再传入nil

apiLoginData.base64EncodedStringWithOptions(nil);

我还尝试在Swift 2中传递NSDataBase64EncodingOptions.Encoding64CharacterLineLength。但是结果仍然不同。

有什么想法吗?

更新2:这不是Swift 1.2或Swift 2的问题。奇怪的是,这两个输出不同的结果..真是令人费解!

更新3:事实证明,正如Martin指出的那样,我的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==
}

第二个编码字符串中的额外部分(4oGg4oGg4oGg)在解码时实际上是无效的。不知道为什么Foundation会添加这样无用的头部。 - Mousavian
我建议您使用本地的String类型和字符串插值,而不是NSString格式化程序。 - Mousavian
1个回答

8

就像在Swift 2.0日历组件错误Swift 2.0 - 二进制运算符 "|" 不能应用于两个UIUserNotificationType操作数中一样,
NSDataBase64EncodingOptions是Swift 2中的OptionSetType。 它提供了一个类似集合的接口,并且可以从数组文字初始化。

因此,有效的选项例如:

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==

是的,但奇怪的是,编码后的字符串结果完全不同。有什么想法吗? - JayVDiyk
@JayVDiyk:我无法重现那个问题。我已经在答案中添加了一个完整的(Swift 2)示例,并且对于Swift 1.2,我得到了完全相同的输出。 - Martin R
请检查我的更新问题,这很奇怪。或者是我漏掉了什么? - JayVDiyk
我已经彻底疯了。请在您的位置上尝试一下,看看它是否表现相同。 - JayVDiyk
1
@JayVDiyk:你的API_USERNAME在字母“a”之前有一些不可见的字符。如果你移除它们(或者重写这个字符串),你会得到相同的结果! - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接