Swift 如何将4个字节转换为快速浮点?
我正在用Swift编写一个MsgPack解析器来学习这门语言。感觉不太适合这项任务,但我一直在进步。现在我遇到了一个问题,我似乎无法说服它将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
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
}