Yur*_*rov 9 nsstring nsdata swift
这是我的功能.首先println打印正确的哈希到控制台,但在下一行程序崩溃.你能帮助我吗?
func sha256(string: NSString) -> NSString {
var data : NSData! = string.dataUsingEncoding(NSUTF8StringEncoding)
var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
let res = NSData(bytes: hash, length: Int(CC_SHA256_DIGEST_LENGTH))
println(res)
let resstr = NSString(data: res, encoding: NSUTF8StringEncoding)
println(resstr)
return resstr
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*n R 41
let resstr = NSString(data: res, encoding: NSUTF8StringEncoding)
Run Code Online (Sandbox Code Playgroud)
返回nil如果数据不表示一个有效的UTF-8序列(这是非常可能的).然后以下println()崩溃.
任意二进制数据的可能字符串表示形式是十六进制字符串或Base-64编码字符串.
甲基地-64编码的字符串可以简单地获得与
let resstr = res.base64EncodedStringWithOptions(nil)
Run Code Online (Sandbox Code Playgroud)
(据我所知)没有内置方法将二进制数据转换为十六进制字符串.Swift中的一个可能的实现(受到许多可用的Objective-C解决方案的启发)是
extension NSData {
func hexString() -> NSString {
var str = NSMutableString()
let bytes = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count:self.length)
for byte in bytes {
str.appendFormat("%02hhx", byte)
}
return str
}
}
Run Code Online (Sandbox Code Playgroud)
但您可以直接将其集成到哈希方法中,而无需使用中间NSData对象:
func sha256(string: NSString) -> NSString {
let data = string.dataUsingEncoding(NSUTF8StringEncoding)!
var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
let resstr = NSMutableString()
for byte in hash {
resstr.appendFormat("%02hhx", byte)
}
return resstr
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23469 次 |
| 最近记录: |