发出base64解码特定字符串

时间:2015-11-04 21:24:26

标签: swift base64 swift2

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

  

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

那里没有换行符,StackOverflow只是包装字符串。我尝试了很多方法来解码这个。我确实收到NSData的结果,但是,当我尝试将NSData转换为NSString对象时,结果总是为零。如果我将编码更改为ASCII或UTF16我收到一个结果,所以我假设Swift没有识别UTF8格式的NSData。但是,如果我基于64解码C#中的相同字符串,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的第一个应用程序,我还在学习。

非常感谢任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

以防任何其他新手需要通过REST和iOS Swift访问Azure存储服务,以下是适用于我的代码。我只在这里使用String扩展,直到我能弄明白。这将最终出现在自己的班级中。

    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!
    }
}