【问题标题】:Swift 2 Decode base64 always return nilSwift 2 Decode base64 总是返回 nil
【发布时间】:2016-12-07 11:14:21
【问题描述】:

我正在尝试从 base64 解码以下字符串而没有任何退出。它总是返回零。我试图将 NSDataBase64DecodingOptions 更改为 IgnoreUnknowCharanters 但它也不起作用。我还尝试删除填充,就像这个答案说 swift base64 decoding returns nil 但我的字符串的长度可以被 4 整除,所以它不起作用。

字符串

PY5ehymWfQKExWxPyOImGiQkxNjyuBREmOXtQdePVpuH9PFzizaO+WTuM1sLouTQPz5UO7csloC9GjOFqkq4POmlB9d3mMJGLB2pVCNs8t9EejOcjV4fRHaITkmfMfVbizCnTvHGBwLWXjLc7gwyhu2+S9qw0NXc5jw6EdEk+zuesrdwLgqws0hDqFSoVw57+CnvUmgXwtNfKP4p64mJ9inH/0xAMarCc5N4Wjz/zmlTyd2PoDFUC/iLdZ7csau7X2M=

选项 1

if let decodedData = NSData(base64EncodedString: base64String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters),
        let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) {
        print(decodedString) // foo
    }

选项 2

 if let decodedData = NSData(base64EncodedString: pnpData, options: NSDataBase64DecodingOptions.init(rawValue: 0)),
        let decodedString = NSString(data: decodedData, encoding: NSUTF8StringEncoding) {
        print(decodedString) // foo
    }

希望你能帮助我。谢谢!!

【问题讨论】:

  • 哪个位返回 nil、数据或从数据创建字符串?你的 base64 字符串是从哪里来的?
  • 我假设 Base64 解码有效,但解码后的数据不代表有效的 UTF-8 序列,因此NSString(data: decodedData ...) 失败。你期待什么结果?
  • @MartinR 它被认为是一个加密字符串,所以在解码后我必须使用 AES 来解密它。
  • @Wain decodedData 有数据但 decodedString 为 nil
  • 那么不要将数据转换为字符串。 AES 解密 数据。

标签: swift base64 decode


【解决方案1】:

以防万一有人试图解决这个从 Java 迁移到 Swift 的问题。

这个答案帮助了我,你可能需要追加(“==”)

Swift 3 base64 decode return nil

您可能需要附加("==")

【讨论】:

  • 真的很有帮助
  • 男人!这个答案救了我的命
【解决方案2】:

我上串怀疑 “PY5ehymWfQKExWxPyOImGiQkxNjyuBREmOXtQdePVpuH9PFzizaO + WTuM1sLouTQPz5UO7csloC9GjOFqkq4POmlB9d3mMJGLB2pVCNs8t9EejOcjV4fRHaITkmfMfVbizCnTvHGBwLWXjLc7gwyhu2 + S9qw0NXc5jw6EdEk + zuesrdwLgqws0hDqFSoVw57 + CnvUmgXwtNfKP4p64mJ9inH / 0xAMarCc5N4Wjz / zmlTyd2PoDFUC / iLdZ7csau7X2M =” P>

这行得通,该字符串也得到编码和解码

    let utf8str = "PY5ehymWfQKExWxPyOImGiQkxNjyuBREmOXtQdePVpuH9PFzizaO+WTuM1sLouTQPz5UO7csloC9GjOFqkq4POmlB9d3mMJGLB2pVCNs8t9EejOcjV4fRHaITkmfMfVbizCnTvHGBwLWXjLc7gwyhu2+S9qw0NXc5jw6EdEk+zuesrdwLgqws0hDqFSoVw57+CnvUmgXwtNfKP4p64mJ9inH/0xAMarCc5N4Wjz/zmlTyd2PoDFUC/iLdZ7csau7X2M=".dataUsingEncoding(NSUTF8StringEncoding)
    let base64Encoded = utf8str?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
    let encodedString : String = base64Encoded!
    print(encodedString) // my encoded data

    let decodedData = NSData(base64EncodedString:  encodedString, options:NSDataBase64DecodingOptions(rawValue: 0))
    let decodedString : String = String(data: decodedData!, encoding: NSUTF8StringEncoding)!
    print(decodedString) // my plain data

这行不通,解码后的字符串没有得到编码

    let decodedData = NSData(base64EncodedString:  "PY5ehymWfQKExWxPyOImGiQkxNjyuBREmOXtQdePVpuH9PFzizaO+WTuM1sLouTQPz5UO7csloC9GjOFqkq4POmlB9d3mMJGLB2pVCNs8t9EejOcjV4fRHaITkmfMfVbizCnTvHGBwLWXjLc7gwyhu2+S9qw0NXc5jw6EdEk+zuesrdwLgqws0hDqFSoVw57+CnvUmgXwtNfKP4p64mJ9inH/0xAMarCc5N4Wjz/zmlTyd2PoDFUC/iLdZ7csau7X2M=", options:NSDataBase64DecodingOptions(rawValue: 0))
    let decodedString : String = String(data: decodedData!, encoding: NSUTF8StringEncoding)!
    print(decodedString) // my plain data

这可能是原因,请查看https://www.base64decode.org/

虽然特殊字符不能保存在字符串中。

【讨论】:

  • 假设是加密字符串
  • 该字符串未加密,当我们在 base64decode.org 上解密时,它应该给出完整消息的含义,但它纯粹是给出特殊字符。我怀疑加密代码。请确保一次。
  • 我从外部 API 接收到这个字符串。你需要一个密钥才能在 AES 中解密它,但无论如何我会联系他们......没有办法解码它。
  • 哦,我猜你在做同样的加密。无法对其进行解码,或者他们必须提供密钥或逻辑来解码此字符串。如果有帮助,您可以接受答案。
【解决方案3】:

也许你可以关注这个

https://github.com/krzyzanowskim/CryptoSwift#data-padding

并使用以下方法解码(我猜你的字符串是用aes cbc和base64编码的,如果你想解码这个字符串,你必须知道编码键和iv)

"PY5ehymWfQKExWxPyOImGiQkxNjyuBREmOXtQdePVpuH9PFzizaO+WTuM1sLouTQPz5UO7csloC9GjOFqkq4POmlB9d3mMJGLB2pVCNs8t9EejOcjV4fRHaITkmfMfVbizCnTvHGBwLWXjLc7gwyhu2+S9qw0NXc5jw6EdEk+zuesrdwLgqws0hDqFSoVw57+CnvUmgXwtNfKP4p64mJ9inH/0xAMarCc5N4Wjz/zmlTyd2PoDFUC/iLdZ7csau7X2M=".decryptBase64ToString(cipher)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-21
    • 2015-12-28
    • 2019-05-31
    • 2018-02-10
    • 2015-08-31
    • 2017-02-10
    • 1970-01-01
    • 2017-03-28
    相关资源
    最近更新 更多