Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String Can';t转换从本地文件读取的NSData,并在Swift中以字符串形式输出_String_Swift_Hex_Nsdata - Fatal编程技术网

String Can';t转换从本地文件读取的NSData,并在Swift中以字符串形式输出

String Can';t转换从本地文件读取的NSData,并在Swift中以字符串形式输出,string,swift,hex,nsdata,String,Swift,Hex,Nsdata,我正在尝试创建一个简单的工具,从项目中的文件中读取特定的偏移地址 我可以很好地读取它并获取字节,问题是我想将结果转换成字符串,但我就是做不到 我的输出是这样的:但我想转换成字符串 找到了一些使用NSData扩展的示例,但仍然不起作用 所以任何人都可以帮忙 这是我的密码: class ViewController: UIViewController { let filemgr = NSFileManager.defaultManager() override func viewDidLoad(

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

我可以很好地读取它并获取字节,问题是我想将结果转换成字符串,但我就是做不到

我的输出是这样的:但我想转换成字符串

找到了一些使用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()
    }
  }
}

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