2017-02-14 8 views
0

いくつかのバイトを取得して文字列に入れることができません。 この関数を使用してデータを取得しています。すべてうまく動作しますが、たとえデータが空でなくても空文字列になるので、関数getBytesで型stringのバッファを使用することはできません。NSDataから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)) 

どうすれば複数の文字を一緒に読むことができますか?

+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" 
} 
関連する問題