Can't convert NSData to NSString in swift

旧城冷巷雨未停 提交于 2019-11-27 01:41:12

问题


This is my function. First println print correct hash to console but in the next row program crashes. Can you help me?

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:


let resstr = NSString(data: res, encoding: NSUTF8StringEncoding)

returns nil if the data does not represent a valid UTF-8 sequence (which is very likely). Then the following println() crashes.

A possible string representation for arbitrary binary data would be a hex string or a Base-64 encoded string.

A Base-64 encoded string can simply be obtained with

let resstr = res.base64EncodedStringWithOptions(nil)

There is (as far as I know) no built-in method to convert binary data to a hex string. A possible implementation in Swift (inspired by the lots of available Objective-C solutions) is

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
    }
}

But you could integrate that into your hash method directly, without using an intermediate NSData object:

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
}


来源:https://stackoverflow.com/questions/25424831/cant-convert-nsdata-to-nsstring-in-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!