【问题标题】:How to convert 4 bytes to a Swift float?如何将 4 个字节转换为 Swift 浮点数?
【发布时间】:2014-08-13 02:30:06
【问题描述】:

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

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

var f:Float = 0

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

print(f)

在操场上我得到:

致命错误:无法打开 Optional.None Playground 执行失败:错误:执行被中断,原因:EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)。

有什么想法可以尝试下一步吗?

【问题讨论】:

标签: swift swift-playground


【解决方案1】:

&amp; 放到&amp;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

【讨论】:

  • 更好:memcpy(&amp;f, bytes, 4)。 - 如果字节 0x04 出现在源缓冲区中,memccpy(&amp;f, bytes, 4, 4) 将停止复制。
  • var 也应该是let 以满足memccpy() 的第二个参数的恒定要求吗?这将显示编译器警告并强制 &bytes 写入字节,即使不是严格要求。
  • 感谢您的帮助。我在操场上仍然遇到同样的错误,在我工作正常的项目中。
  • 你也可以做 memcpy(&f, bytes, UInt(sizeof(Float))),虽然这有点难看,而且你还是硬编码了数组大小。也许是一个断言(sizeof(Float) == 4)。
  • @MartinR & Grimxn - 你应该使用 ContiguousArray 而不是 Array?
【解决方案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

}

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多