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

Bri*_*ian 10 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)
Run Code Online (Sandbox Code Playgroud)

我在操场上得到:

致命错误:无法解包Optional.None Playground执行失败:错误:执行被中断,原因:EXC_BAD_INSTRUCTION(代码= EXC_I386_INVOP,子代码= 0x0).

任何想法接下来要尝试什么?

Gri*_*mxn 13

掉落&&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
Run Code Online (Sandbox Code Playgroud)

更新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
Run Code Online (Sandbox Code Playgroud)

  • 更好:`memcpy(&f,bytes,4)`. - 如果源缓冲区中出现字节"0x04",`memccpy(&f,bytes,4,4)`将停止复制. (5认同)