无法转换从本地文件读取的NSData并在Swift中作为字符串输出

时间:2015-04-15 00:42:40

标签: string swift hex nsdata

我正在尝试创建一个简单的工具来从项目中的文件中读取特定的偏移地址。

我可以读得很好并获得字节,问题是我想将结果转换为字符串,但我不能。

我的输出是这样的:< 00000100 88000d00 02140dbb 05c3a282>但我想进入String。

找到一些使用NSData扩展程序执行此操作的示例,但仍无效。

所以任何人都可以帮忙?

这是我的代码:

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

2 个答案:

答案 0 :(得分:0)

只要您知道编码,就可以从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")
}

答案 1 :(得分:0)

@Martin R建议此链接的正确答案:https://codereview.stackexchange.com/a/86613/35991

以下是代码:

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

}

我这样用过:

let token = byte.hexString()