2015-11-04 71 views
0

我有以下base64编码串,我需要使用夫特为base64对其进行解码:问题BASE64特定字符串进行解码

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

这里没有换行符,StackOverflow只是包装字符串。我已经尝试了很多方法来base64解码这个。但是,当我尝试将NSData转换为NSString对象时,结果始终为零。如果我将编码更改为ASCII或UTF16,我会收到一个结果,所以我认为Swift无法识别UTF8格式的NSData。但是,如果我base 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中的第一个应用程序,我仍然在学习。

任何帮助,非常感谢。

谢谢!

+1

'decodedData'是'<2a2987b1 ... fad22924>'这绝对是*不*有效的UTF-8序列。你期望什么结果? –

+0

我想实现Azure共享访问签名从iOS查询我的Azure存储服务。这是他们给我的访问密钥(别担心,我已经重置了我的密钥)。但是,当它们尝试将base64解码到NSString中时,它们都不在Swift中工作,因此我可以使用解码字符串作为HMACSHA256的密钥来生成共享访问签名。 – Josh

+0

我对Azure和Azure签名算法的详细信息一无所知。但我强烈地认为,您可以直接使用* data *作为HMACSHA256的关键字,而不是先将其转换为字符串。 –

回答

1

您的“base64”字符串无效。如果您尝试在some online decoder中对其进行解码,则失败。但是,你的代码是有效的:)
修正
如果被编码的原始数据不是字符串数据,然后我用@马丁 - [R

+0

Base64字符串*有效*。它解码为不能表示为NSString的二进制数据。在线解码器最有可能失败,因为它也假定解码后的数据表示一些编码中的字符串(UTF-8或ISO拉丁或...) –

+0

不幸的是,我没有制作base64字符串。它来自另一个系统。在Swift中有一种方法可以将它解码为NSString吗?最终我的目标是采用这个base64编码的字符串,解码它,然后使用解码值作为HMACSHA256密钥。这都是使用Microsoft Azure存储服务REST API进行身份验证的一部分。 – Josh

0

同意万一有人其他新手需要打Azure存储服务通过REST和iOS Swift,下面是为我工作的代码。我只在这里使用了字符串扩展,直到我能弄明白。这将最终在自己的班级。

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