Как преобразовать 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 (code=EXC_I386_INVOP, подкод=0х0).
есть идеи, что попробовать дальше?
2 ответов
Падение &
on &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
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
}