2014-06-23 18 views
10

Dili öğrenmek için Swift dilinde bir MsgPack çözümleyicisi yazıyorum. Bu görev için çok uygun değil ama ilerleme kaydediyorum. Şimdi, 4 bayt'ı bir float'a dönüştürmek için ikna edemediğim bir bloğa rastladım. Oyun alanında Nasıl bir Swift float 4 bayt dönüştürmek için?

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

var f:Float = 0 

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

print(f) 

alıyorum:

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

Herhangi bir fikir sonra ne deneyebilirim?

+1

& bayt üzerinde bırakın. – Grimxn

cevap

12

&bytes'da &'u bırakın. bytes bir dizidir.

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 

Güncelleme Swift 3

memccpy yorumcu söylediler, Swift 3'te çalışmaya memcpy kullanmak görünmüyor:

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

Daha iyi: 'memcpy (& f, bayt, 4)'. - 'memccpy (& f, bayt, 4, 4)', kaynak arabelleğinde byte '0x04' oluşuyorsa kopyalama işlemini durdurur. –

+0

'Var' ayrıca memccpy() 'nin ikinci parametresinin sabit gereksinimini karşılayabilmelidir mi? Bu, daha sonra gerekli olmasa bile, bir derleyici uyarısı ve bayt olarak yazılacak zorunlu & bytes gösterecektir. – sketchyTech

+0

Yardım için teşekkürler. Hala iyi bir projede, oyun alanında aynı hatayı alıyorum. – 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 

} 
İlgili konular