2014-09-15 6 views
2

내가 목표 - C에서 다음 코드는 한 NSInputStream에 대한 스위프트에 오브젝티브 C 방법을 변환합니다. 하지만 스위프트로 변환하는 방법을 모르겠습니다.는 (더블로 바이트 변환)

public func readDouble() -> Double { 

    var value : Double = 0.0 

    var num = self.read((uint8_t *)&value, maxLength:8) // got compiling error here! 
    if num != 8 { 

    } 
} 

오류 메시지는 다음과 같습니다 :

유형의 인수 목록 '&'을 호출 할 수 없습니다 '($ T4, 최대 길이 : IntegerLiteralConvertible)'

여기 내 코드입니다

아무도 도와 줄 수 있습니까? 감사합니다

내가 사용하고있어 테스트 데이터 (1.25) :

14 AE 47 E1 7A 14 F4 3F 

UPDATE :

간단한 C 솔루션,하지만 어떻게 스위프트에서이 작업을 수행하려면?

double d = 0; 
unsigned char buf[sizeof d] = {0}; 

memcpy(&d, buf, sizeof d); 

답변

2

이 작동합니다 :

let num = withUnsafeMutablePointer(&value) { 
    self.read(UnsafeMutablePointer($0), maxLength: sizeofValue(value)) 
} 

설명 : value의 주소로 설정 (속기 표기법 $0) 만 인수 와 폐쇄 (블록)를 호출 withUnsafeMutablePointer()을.

$0 따라서 다른 변환이 필요한지, 그리고 UnsafeMutablePointer<Double>read() 첫번째 인수로 UnsafeMutablePointer<UInt8> 기대의 유형을 갖는다. 클로저의 반환 값은 num에 할당됩니다.

+0

죄송합니다. 작동하지 않습니다. ** " '(UnsafeMutablePointer , maxLength : IntegerLiteralConvertible)'형식의 인수 목록으로 'init'을 호출 할 수 없습니다."** ** –

+0

@bagusflyer : 업데이트 된 답변을 참조하십시오. –

+0

좋습니다, 시도하겠습니다. 그건 그렇고, 난 왜 대답 downvote 이유가 아니에요. 어쨌든 내가 너에게 표를 던질거야. –

1

방법은 위의 스위프트 2를 사용, 나를 위해 작동하지 않습니다하지만 난이 변환하고 그 반대의 경우도 마찬가지 할 수있는 훨씬 더 간단한 방법을 발견 :

func binarytotype <T> (value: [UInt8], _: T.Type) -> T 
{ 
    return value.withUnsafeBufferPointer 
    { 
     return UnsafePointer<T>($0.baseAddress).memory 
    } 
} 

func typetobinary <T> (var value: T) -> [UInt8] 
{ 
    return withUnsafePointer(&value) 
    { 
     Array(UnsafeBufferPointer(start: UnsafePointer<UInt8>($0), count: sizeof(T))) 
    } 
} 

let a: Double = 0.25 
let b: [UInt8] = typetobinary(a) // -> [0, 0, 0, 0, 0, 0, 208, 63] 
let c = binarytotype(b, Double.self) // -> 0.25 

내가 놀이터에서 엑스 코드 7.2을 테스트 한합니다.

0

다음은 Martin 3x와는 다른 Swift 3 베타 6의 업데이트 버전입니다.

func binarytotype <T> (_ value: [UInt8], _ : T.Type) -> T 
{ 
    return value.withUnsafeBufferPointer 
    { 
     UnsafeRawPointer($0.baseAddress!).load(as: T.self) 
    } 
} 

func typetobinary <T> (_ value: T) -> [UInt8] 
{ 
    var v = value 
    let size = MemoryLayout<T>.size 
    return withUnsafePointer(to: &v) 
    { 
     $0.withMemoryRebound(to: UInt8.self, capacity: size) 
     { 
      Array(UnsafeBufferPointer(start: $0, count: size)) 
     } 
    }  
} 

let dd: Double = 1.23456    // -> 1.23456 
let d = typetobinary(dd)    // -> [56, 50, 143, 252, 193, 192, 243, 63] 
let i = binarytotype(d, Double.self) // -> 1.23456