无法在swift中将NSData转换为NSString

时间:2014-08-21 11:09:51

标签: nsstring swift nsdata

这是我的功能。第一个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
}

1 个答案:

答案 0 :(得分:41)

let resstr = NSString(data: res, encoding: NSUTF8StringEncoding)
如果数据不代表有效的UTF-8序列(非常可能),则

返回nil。然后,以下println()崩溃。

任意二进制数据的可能字符串表示形式 十六进制字符串或Base-64编码字符串。

可以使用

简单地获得 Base-64编码的字符串
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对象:

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
}