【问题标题】:Base 64 Decoding [duplicate]Base 64 解码 [重复]
【发布时间】:2018-11-17 07:32:33
【问题描述】:

我正在从服务器获取 base64 字符串,如下所示

eyJhY3IiOjIsInN1YiI6IjNmZDFhNzQwLWJjZTItMTAzNS04NDUxLWVkODRlMTM4MmFhMiIsImF1ZCI6IjZjZjY3M2ZkLTlkODEtNDU5OS04MGJkLWM5ODRiMmNiZDQ2NSIsIm...

我试图用下面的代码(作为字符串扩展)来决定这个字符串

//: ### Base64 decoding a string
func base64Decoded() -> String? {
    guard let data = Data(base64Encoded: self) else { return nil }
    return String(data: data, encoding: .utf8)
}

但它会重新调整为零。

也尝试使用以下代码(来自GIT

guard let plainData = (serverString as NSString).dataUsingEncoding(NSUTF8StringEncoding) else {
    fatalError()
}

let base64String = plainData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
print(base64String) // Zm9v
// Decoding
if let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions(rawValue: 0)),
    let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) {
        print(decodedString) // foo
}

但是,我仍然无法读取来自服务器的 Base64 字符串。请提出我在解码来自服务器的字符串时做错了什么。

【问题讨论】:

  • 也许这是stackoverflow.com/q/29152706/1187415 ? Base64字符串的长度是4的倍数吗?
  • 试试Data(base64Encoded: self, options: .ignoreUnknownCharacters)
  • this 对您的问题有帮助吗?
  • @MartinR 谢谢,它有帮助。长度不是 4 的倍数,

标签: ios swift


【解决方案1】:

我相信你错过了 base64 编码的要点。

你得到的是一个代表任何数据的 UTF8 字符串。通过解码此字符串,您可以获得数据。这些数据可能是也可能不是字符串,在您的情况下它们看起来不是。

使用一个简单的在线工具,我发现您在此处粘贴的字符串转换为:

{"acr":2,"sub":"3fd1a740-bce2-1035-8451-ed84e1382aa2","aud":"6cf673fd-9d81-4599-80bd-c984b2cbd465","

现在您从Data(base64Encoded: 获取数据,那么您可能正在寻找JSONSerialization.jsonObject(with: 从这些数据中获取字典。

但是根本没有理由将 base64 字符串转换为数据,然后再转换为 UTF8 字符串。您的方法应如下所示:

func base64Decoded() -> Data? {
    return Data(base64Encoded: self)
}

你可以用它做任何你想做的事:

if let data = serverString.base64Decoded(), let dictionary = (try? JSONSerialization.jsonObject(with: data, options: .allowFragments)) as? [String: Any] {
    // Do something with dictionary
}

【讨论】:

    【解决方案2】:

    请尝试以下一种:

    guard let data = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)  else{
     return 
    } 
    let someString = String(data: data, encoding: NSUTF8StringEncoding)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      相关资源
      最近更新 更多