Swift Issue base64解码特定字符串

Swift Issue base64解码特定字符串,swift,base64,swift2,Swift,Base64,Swift2,我有以下base64编码字符串,需要使用Swift对其进行base64解码: KIMHSER2RVF9RPJAJWO4K/odT51hTlISwMKNIfPUC+gXYZKNjGDCvHEom++6liXNq6PkStnpzMKBsTk+tIpJA== 这里没有换行,StackOverflow只是在包装字符串。我尝试了很多方法来解码这个。我确实以NSData的形式接收结果,但是,当我尝试将NSData转换为NSString对象时,结果始终为零。如果我将编码更改为ASCII或UTF16,我会收到一

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

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

这里没有换行,StackOverflow只是在包装字符串。我尝试了很多方法来解码这个。我确实以NSData的形式接收结果,但是,当我尝试将NSData转换为NSString对象时,结果始终为零。如果我将编码更改为ASCII或UTF16,我会收到一个结果,因此我假设Swift无法识别UTF8格式的NSData。但是,如果我用C对同一字符串进行Base64解码,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的第一次应用,我还在学习

非常感谢您的帮助


谢谢

您的base64字符串无效。如果你试图用它来解码,它就会失败。但您的代码是有效的: 校正
如果编码的原始数据不是字符串数据,那么我同意@Martin R

,以防其他新手需要通过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!
    }
}

decodedData是,它肯定不是有效的UTF-8序列。您希望得到什么结果?我正在尝试实现Azure共享访问签名,以便从iOS查询我的Azure存储服务。这是他们给我的钥匙别担心,我已经重置了钥匙。但是,当尝试将base64解码为NSString时,它们都不能在Swift中工作,因此我可以使用解码字符串作为HMACSHA256的密钥来生成共享访问签名。我不知道Azure以及Azure签名算法的详细信息。但是我强烈假设您可以直接使用数据作为HMACSHA256的密钥,而不是首先将其转换为字符串。谢谢Martin。到目前为止,我发现的所有示例都使用字符串,但我将仅使用NSData研究选项。Base64字符串是有效的。它解码为不能表示为NSString的二进制数据。在线解码器很可能会失败,因为它还假设解码的数据表示某种编码UTF-8或ISO拉丁语的字符串,或者……不幸的是,我没有使用base64字符串。它来自另一个系统。有没有办法用Swift把它解码成一个字符串?最终,我的目标是获取这个base64编码字符串,对其进行解码,然后将解码值用作HMACSHA256键。这都是使用Microsoft Azure存储服务REST API进行身份验证的一部分。