这是我的职责 首先将println正确的哈希值打印到控制台,但在下一行程序崩溃。你能帮助我吗?
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 }
let resstr = NSString(data: res, encoding: NSUTF8StringEncoding)
返回nil如果数据不表示一个有效的UTF-8序列(这是非常可能的)。然后以下println()崩溃。
nil
println()
任意二进制数据的可能字符串表示形式可能是十六进制字符串或Base-64编码的字符串。
甲 Base64编码串 可以简单地获得与
let resstr = res.base64EncodedStringWithOptions(nil)
据我所知,没有内置的方法可以将二进制数据转换为 十六进制字符串 。在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 } }
但是您可以将其直接集成到您的哈希方法中,而无需使用中间NSData对象:
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 }