gpt4 book ai didi

nsstring - 无法快速将 NSData 转换为 NSString

转载 作者:IT王子 更新时间:2023-10-29 05:38:42 28 4
gpt4 key购买 nike

这是我的职责。首先 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)

如果数据不代表有效的 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
}

关于nsstring - 无法快速将 NSData 转换为 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25424831/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com