从 NSData 中获取字节并将结果放入字符串中

getBytes from NSData and put the result in a string

我无法获取一些字节并将它们放入字符串中... 我正在使用这个函数来获取数据。一切正常,但我不能将字符串类型的缓冲区与函数 getBytes 一起使用,因为它会导致空字符串,即使数据不为空也是如此。

private func getTYPE() {
    let x = NSMutableData(contentsOf: URL(fileURLWithPath: path))
    let _mode_: [UInt8] = [0x66, 0x74, 0x79, 0x70]
    let data = NSData(bytes: _mode_, length: _mode_.count)
    let range = x?.range(of: data as Data, in: NSRange(location: 0, length: (x?.length)!))

    // Problems here
    var y: String = ""
    x?.getBytes(&y, range: NSRange(location: (range?.location)! + (range?.length)!, length: 3))
    Swift.print(y) // Print result
}

它不会抛出任何类型的异常,但字符串始终为空... 如果我尝试只获取 UInt8 而不是字符串,则相同的函数效果很好:

// Working Context
var y: UInt8 = 0
x?.getBytes(&y, range: NSRange(location: (range?.location)! + (range?.length)!, length: 1))

那么如何同时读多个字符呢?

就是这样un-Swift!大概你是从一些旧的 Obj-C 代码或类似的代码转换过来的。

如您所知,您可以传递一个指向 UInt8 的指针来获取一个字节。如果你想要几个字节,使用 UInt8s 的数组,但如果你想要一个字符串,只需使用 var s = String(data: ...)

请参阅下面的示例(为清楚起见,我删除了范围内容):

let x: NSMutableData = "A test string".data(using: .utf8) as! NSMutableData

var y: [UInt8] = [0,0,0]
x.getBytes(&y, range: NSRange(location: 0, length: 3))
y // [65, 32, 116]

if let s = String(data: x as Data, encoding: .utf8) {
    s // "A test string"
}