Как конвертировать 4 байта в Swift float?

Я пишу парсер MsgPack в Swift, чтобы изучить язык. Он не очень хорошо подходит для этой задачи, но я добился прогресса. Теперь я попал в блок, где я не могу убедить его преобразовать 4 байта в float.

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

var f:Float = 0

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

print(f)

На игровой площадке я получаю:

фатальная ошибка: невозможно развернуть Необязательный. Выполнение игровой площадки не выполнено: ошибка: выполнение прервано, причина: EXC_BAD_INSTRUCTION (код = EXC_I386_INVOP, субкод = 0x0).

Любые идеи, что попробовать дальше?

Ответ 1

Отбросьте & на &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

Обновить Swift 3

memccpy, похоже, не работает в Swift 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

Ответ 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

}