【发布时间】: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 的选项。