Как конвертировать 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
}