10

言語を学ぶ方法として、Swift で MsgPack パーサーを作成しています。タスクにはあまり適していないように感じますが、私は進歩しています。ここで、4 バイトを float に変換するように説得できないブロックにぶつかりました。

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

var f:Float = 0

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

print(f)

遊び場で私は得る:

致命的なエラー: Optional.None プレイグラウンドの実行に失敗しました: エラー: 実行が中断されました。理由: EXC_BAD_INSTRUCTION (コード = EXC_I386_INVOP、サブコード = 0x0)。

次に何を試すべきか?

4

2 に答える 2

14

をドロップ&&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コメンテーターが言ったように、次を使用します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
于 2014-06-23T08:27:39.243 に答える
3
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

}
于 2015-10-05T02:53:54.697 に答える