2014-06-23 6 views
10

언어를 배우는 방법으로 Swift에 MsgPack 파서를 쓰고 있습니다. 그것은 그 일에 아주 잘 맞는 느낌이 들지 않지만 나는 진전을 이루고 있습니다. 이제는 4 바이트를 플로트로 변환하도록 설득 할 수없는 블록을 쳤습니다. 놀이터에서 4 바이트를 신속 부동 소수점으로 변환하는 방법?

var bytes:Array<UInt8> = [0x9A, 0x99, 0x99, 0x41] //19.20000 

var f:Float = 0 

memccpy(&f, &bytes, 4, 4) 

print(f) 

내가 얻을 :

fatal error: Can't unwrap Optional.None Playground execution failed: error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).

모든 아이디어를 어떻게 다음 시도?

+1

는 & 바이트에 놓습니다. – Grimxn

답변

12

&&bytes에 놓습니다. bytes은 배열입니다.

var bytes:Array<UInt8> = [0x9A, 0x99, 0x99, 0x41] //19.20000 

    var f:Float = 0.0 

    memccpy(&f, bytes, 4, 4) // as per OP. memcpy(&f, bytes, 4) preferred 

    println ("f=\(f)")// f=19.2000007629395 

업데이트 스위프트 3

memccpy는 해설자가 말했듯이, 스위프트 3에서 작동 memcpy를 사용하지 않는 것 :

import Foundation 
var bytes:Array<UInt8> = [0x9A, 0x99, 0x99, 0x41] //19.20000 

var f:Float = 0.0 

/* Not in Swift 3 
memccpy(&f, bytes, 4, 4) // as per OP. 

print("f=\(f)")// f=19.2 
*/ 

memcpy(&f, bytes, 4)/

print("f=\(f)")// f=19.2 
+5

더 나은 :'memcpy (& f, bytes, 4)'. -'memccpy (& f, bytes, 4, 4)'는 소스 버퍼에서 바이트 '0x04'가 발생하면 복사를 멈춘다. –

+0

'var'도 memccpy()의 두 번째 매개 변수의 상수 요구 사항을 만족하도록'let '해야합니까? 이것은 엄격하게 요구되지는 않더라도 컴파일러 경고와 강제 & 바이트를 바이트로 기록하도록 표시했습니다. – sketchyTech

+0

도움을 주셔서 감사합니다. 놀이터에서 여전히 같은 오류가 발생합니다. 잘 작동하는 프로젝트에서. – Brian

2
public func parseInt32(bytes:[UInt8], offset:Int)->Int32{ 

    var pointer = UnsafePointer<UInt8>(bytes) 
    pointer = pointer.advancedBy(offset) 

    let iPointer = UnsafePointer<Int32>(pointer) 
    return iPointer.memory 

} 

public func parseFloat32(bytes:[UInt8], offset:Int)->Float32{ 
    var pointer = UnsafePointer<UInt8>(bytes) 
    pointer = pointer.advancedBy(offset) 

    let fPointer = UnsafePointer<Float32>(pointer) 
    return fPointer.memory 

} 
관련 문제