String Can';t转换从本地文件读取的NSData,并在Swift中以字符串形式输出
我正在尝试创建一个简单的工具,从项目中的文件中读取特定的偏移地址 我可以很好地读取它并获取字节,问题是我想将结果转换成字符串,但我就是做不到 我的输出是这样的:但我想转换成字符串 找到了一些使用NSData扩展的示例,但仍然不起作用 所以任何人都可以帮忙 这是我的密码:String Can';t转换从本地文件读取的NSData,并在Swift中以字符串形式输出,string,swift,hex,nsdata,String,Swift,Hex,Nsdata,我正在尝试创建一个简单的工具,从项目中的文件中读取特定的偏移地址 我可以很好地读取它并获取字节,问题是我想将结果转换成字符串,但我就是做不到 我的输出是这样的:但我想转换成字符串 找到了一些使用NSData扩展的示例,但仍然不起作用 所以任何人都可以帮忙 这是我的密码: class ViewController: UIViewController { let filemgr = NSFileManager.defaultManager() override func viewDidLoad(
class ViewController: UIViewController {
let filemgr = NSFileManager.defaultManager()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let pathToFile = NSBundle.mainBundle() .pathForResource("control", ofType: "bin")
let databuffer = filemgr.contentsAtPath(pathToFile!)
let file: NSFileHandle? = NSFileHandle(forReadingAtPath: pathToFile!)
if file == nil {
println("File open failed")
} else {
file?.seekToFileOffset(197584)
let byte = file?.readDataOfLength(16)
println(byte!)
file?.closeFile()
}
}
}
只要知道编码,就可以从
NSData
对象中创建如下字符串
let str = NSString(data: data, encoding: NSUTF8StringEncoding)
顺便说一下,您可能希望尝试使用if let
来展开选项,而不是强制展开,以考虑失败的可能性:
let filemgr = NSFileManager.defaultManager()
if let pathToFile = NSBundle.mainBundle() .pathForResource("control", ofType: "bin"),
databuffer = filemgr.contentsAtPath(pathToFile),
file = NSFileHandle(forReadingAtPath: pathToFile)
{
file.seekToFileOffset(197584)
let bytes = file.readDataOfLength(16)
let str = NSString(data: bytes, encoding: NSUTF8StringEncoding)
println(str)
file.closeFile()
}
else {
println("File open failed")
}
正确答案如下@Martin R对该链接的建议: 代码如下:
extension NSData {
func hexString() -> String {
// "Array" of all bytes:
let bytes = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes), count:self.length)
// Array of hex strings, one for each byte:
let hexBytes = map(bytes) { String(format: "%02hhx", $0) }
// Concatenate all hex strings:
return "".join(hexBytes)
}
因为
不是UTF-8编码的字符串。而且它看起来也不像ascii,第一个字节是0作为开始…这是十六进制的响应,地址和长度在代码上通知,应该为这个二进制数据创建什么字符串?正如我说的,我希望将正好是16字节十六进制的输出数据转换成字符串,以便稍后通过代码进行操作。因此,您希望使用类似于“0000010088000d0002140dbb05c3a282”
?包含一种可能的转换方法(中的版本略有改进)。但我相信之前也有过类似的转换。谢谢@Martin R,第二个链接已经解决。
let token = byte.hexString()