Swift 如何将4个字节转换为快速浮点?

Swift 如何将4个字节转换为快速浮点?,swift,swift-playground,Swift,Swift Playground,我正在用Swift编写一个MsgPack解析器来学习这门语言。感觉不太适合这项任务,但我一直在进步。现在我遇到了一个问题,我似乎无法说服它将4个字节转换成浮点 var bytes:Array<UInt8> = [0x9A, 0x99, 0x99, 0x41] //19.20000 var f:Float = 0 memccpy(&f, &bytes, 4, 4) print(f) var bytes:Array=[0x9A,0x99,0x99,0x41]//1

我正在用Swift编写一个MsgPack解析器来学习这门语言。感觉不太适合这项任务,但我一直在进步。现在我遇到了一个问题,我似乎无法说服它将4个字节转换成浮点

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

var f:Float = 0

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

print(f)
var bytes:Array=[0x9A,0x99,0x99,0x41]//19.20000
变量f:Float=0
memccpy(&f,&bytes,4,4)
印刷品(f)
在操场上,我得到:

致命错误:无法展开可选。无 操场执行失败:错误:执行被中断,原因:EXC_BAD_指令(代码=EXC_I386_INVOP,子代码=0x0)


你知道下一步要做什么吗?

&
放在
&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
public func parseInt32(字节:[UInt8],偏移量:Int)->Int32{
变量指针=非安全指针(字节)
指针=pointer.advancedBy(偏移量)
让iPointer=UnsafePointer(指针)
返回内存
}
public func parseFloat32(字节:[UInt8],偏移量:Int)->Float32{
变量指针=非安全指针(字节)
指针=pointer.advancedBy(偏移量)
设fPointer=UnsafePointer(指针)
返回fPointer.memory
}

Better:
memcpy(&f,bytes,4)
-<如果源缓冲区中出现字节
0x04
,则code>memccpy(&f,bytes,4,4)停止复制。是否也应
var
以满足memccpy()第二个参数的常量要求?这将显示一个编译器警告,并强制将&bytes作为字节写入,即使它不是严格要求的。谢谢您的帮助。在操场上,我仍然会遇到同样的错误,在一个项目中,我工作得很好。你也可以使用memcpy(&f,bytes,UInt(sizeof(Float)),尽管这有点难看,而且你需要硬编码数组大小。可能是一个断言(sizeof(Float)==4)。@MartinR&Grimxn-你应该使用ContiguousArray而不是Array吗?同样的问题,swift 5回答:
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

}