2017-02-14 27 views
0

Я не могу получить несколько байтов и поместить их в строку ... Я использую эту функцию для получения данных. Все работает хорошо, но я не могу использовать буфер типа string с функцией getBytes, так как это приведет к пустой строке, даже если данные не пусты.getBytes из NSData и поместить результат в строку

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

Итак, как я могу прочитать несколько символов вместе?

+0

Данные MutableCollection из байтов. вы можете использовать copyBytes и передать диапазон. –

+0

'let x =" тестовая строка ".data (с использованием: .utf8)! var y: [UInt8] = [0,0,0] x.copyBytes (to: & y, from: 0 .. <3) ​​ y // [65, 32, 116] ' –

ответ

2

Это так быстро! Предположительно, вы переходите из какого-то старого кода Obj-C или некоторых из них.

Как вы поняли, вы можете передать указатель на UInt8, чтобы получить байт. Если вы хотите несколько байт, использовать массив UInt8 с, но если вы хотите строку просто использовать 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" 
}