2014-06-23 19 views
10

Piszę parser MsgPack w Swift jako sposób na naukę języka. Nie czuje się bardzo dobrze do tego zadania, ale robię postępy. Teraz trafiłem na blok, w którym nie mogę przekonać go do przekonwertowania 4 bajtów na zmienną.Jak przekonwertować 4 bajty na Swift float?

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

var f:Float = 0 

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

print(f) 

na boisku pojawia się:

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

Jakieś pomysły co próbować dalej?

+1

upuść i na bajtach. – Grimxn

Odpowiedz

12

Upuść & na &bytes. bytes to tablica.

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 

Aktualizacja Swift 3

memccpy nie wydają się działać w Swift 3. Jak komentatorów powiedział, użyj 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

Lepsze: 'memcpy (& f, bytes, 4)'. - 'memccpy (& f, bytes, 4, 4)' zatrzymuje kopiowanie, jeśli bajt '0x04' występuje w buforze źródłowym. –

+0

Czy 'var' również powinien" pozwolić "spełnić stałe wymaganie drugiego parametru memccpy()? Następnie wyświetliłoby się ostrzeżenie kompilatora i wymuszone & bajty do zapisania jako bajty, nawet jeśli nie jest to wymagane. – sketchyTech

+0

Dzięki za pomoc. Nadal mam ten sam błąd na placu zabaw, w projekcie, w którym pracuję bez zarzutu. – 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 

} 
Powiązane problemy