我有以下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的第一个应用程序,我还在学习。
非常感谢任何帮助。
谢谢!
答案 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!
}
}