【问题标题】:Issue base64 decoding a specific string问题 base64 解码特定字符串
【发布时间】:2016-02-05 13:30:46
【问题描述】:

我有以下 base64 编码字符串,我需要使用 Swift 对其进行 base64 解码:

KimHser2RvFf9RPjajWO4K/odT51hTlISwMKNIfPUC+gXYZKNjGDCvHEom++6liXNq6PkStnpzMKBsTk+tIpJA==

那里没有换行符,StackOverflow 只是包装字符串。我已经尝试了很多方法来对它进行 base64 解码。我确实收到了 NSData 的结果,但是,当我尝试将 NSData 转换为 NSString 对象时,结果总是为零。如果我将编码更改为 ASCII 或 UTF16,我会收到一个结果,所以我假设 Swift 无法识别 UTF8 格式的 NSData。但是,如果我在 C# 中对相同的字符串进行 base 64 解码,则 UTF8 有效,而 Base64 解码有效。所以我很肯定,由于我缺乏使用 Swift 的经验,我错过了一步。

这是我最近的尝试:

import Foundation

extension String {
// MARK: Base64 encode
func base64Encode() -> String {
    let data : NSData = self.dataUsingEncoding(NSUTF8StringEncoding)!
    return data.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
}

// MARK: Base64 decode
func base64Decode() -> String {
    let decodedData = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0))
    let decodedString = NSString(data: decodedData!, encoding: NSUTF8StringEncoding)
    return decodedString as! String
}
}

我很肯定这很容易。不过,这是我在 Swift 中的第一个应用程序,我还在学习中。

非常感谢任何帮助。

谢谢!

【问题讨论】:

  • decodedData<2a2987b1 ... fad22924> 这绝对是不是一个有效的 UTF-8 序列。你期待什么结果?
  • 我正在尝试实现 Azure 共享访问签名以从 iOS 查询我的 Azure 存储服务。这是他们给我的访问密钥(别担心,我已经重置了我的密钥)。但是,当尝试将 base64 解码为 NSString 时,它们都不能在 Swift 中工作,因此我可以使用解码字符串作为 HMACSHA256 的密钥来生成共享访问签名。
  • 我对 Azure 和 Azure 签名算法的细节一无所知。但我强烈假设您可以直接使用 data 作为 HMACSHA256 的密钥,而不是先将其转换为字符串。
  • 谢谢马丁。到目前为止,我发现的所有示例都使用字符串,但我将研究仅使用 NSData 的选项。

标签: swift base64 swift2


【解决方案1】:

您的“base64”字符串无效。如果您尝试在some online decoder 中对其进行解码,则会失败。但是您的代码是有效的 :)
更正
如果编码的原始数据不是字符串数据,那么我同意@Martin R

【讨论】:

  • Base64 字符串有效。它解码为不能表示为 NSString 的二进制数据。在线解码器很可能会失败,因为它还假定解码后的数据表示某种编码(UTF-8 或 ISO 拉丁语或...)的字符串
  • 不幸的是,我没有制作那个 base64 字符串。它来自另一个系统。在 Swift 中有没有办法可以将其解码为 NSString?最终我的目标是获取这个 base64 编码的字符串,对其进行解码,然后将解码值用作 HMACSHA256 密钥。这都是使用 Microsoft Azure 存储服务 REST API 进行身份验证的一部分。
【解决方案2】:

以防万一其他新手需要通过 REST 和 iOS Swift 访问 Azure 存储服务,下面是对我有用的代码。我只在这里使用字符串扩展,直到我弄明白为止。这将在它自己的类中结束。

    import Foundation

enum HMACAlgorithm {
    case MD5, SHA1, SHA224, SHA256, SHA384, SHA512

    func toCCHmacAlgorithm() -> CCHmacAlgorithm {
        var result: Int = 0
        switch self {
        case .MD5:
            result = kCCHmacAlgMD5
        case .SHA1:
            result = kCCHmacAlgSHA1
        case .SHA224:
            result = kCCHmacAlgSHA224
        case .SHA256:
            result = kCCHmacAlgSHA256
        case .SHA384:
            result = kCCHmacAlgSHA384
        case .SHA512:
            result = kCCHmacAlgSHA512
        }
        return CCHmacAlgorithm(result)
    }

    func digestLength() -> Int {
        var result: CInt = 0
        switch self {
        case .MD5:
            result = CC_MD5_DIGEST_LENGTH
        case .SHA1:
            result = CC_SHA1_DIGEST_LENGTH
        case .SHA224:
            result = CC_SHA224_DIGEST_LENGTH
        case .SHA256:
            result = CC_SHA256_DIGEST_LENGTH
        case .SHA384:
            result = CC_SHA384_DIGEST_LENGTH
        case .SHA512:
            result = CC_SHA512_DIGEST_LENGTH
        }
        return Int(result)
    }
}

extension String {

    func hmac(algorithm: HMACAlgorithm, key: String) -> String {
        let cKey = key.base64DecodeAsData();
        let cData = self.cStringUsingEncoding(NSUTF8StringEncoding)
        var result = [CUnsignedChar](count: Int(algorithm.digestLength()), repeatedValue: 0)
        let strLen = Int(strlen(cData!))
        CCHmac(algorithm.toCCHmacAlgorithm(), cKey.bytes, cKey.length, cData!, strLen, &result)
        let hmacData:NSData = NSData(bytes: result, length: (Int(algorithm.digestLength())))
        let hmacBase64 = hmacData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding76CharacterLineLength)
        return String(hmacBase64)
    }

    func base64DecodeAsData() -> NSData {
        let decodedData = NSData(base64EncodedString: self, options: NSDataBase64DecodingOptions(rawValue: 0))
        return decodedData!
    }
}

【讨论】:

    猜你喜欢
    • 2016-05-05
    • 2011-09-22
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多