2017-02-14 10 views
0

일부 바이트를 가져 와서 문자열에 넣을 수 없습니다 ... 이 함수를 사용하여 데이터를 가져옵니다. 모든 것이 잘 작동하지만 데이터가 비어 있지 않아도 빈 문자열이되므로 getBytes 함수에 type 문자열의 버퍼를 사용할 수 없습니다.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" 
}