2016-09-14 8 views
1

にバイナリ読むには:正常に動作しますが、少し面倒ですきれいな方法は、私は現在、これをやっているフロート

let floatData: [UInt8] = [0x00, 0x3F, 0xC0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x66, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0x00, 0x66, 0x00] 


floatData.withUnsafeBufferPointer { (bytes: UnsafeBufferPointer<UInt8>) -> Float in 
    let byteOffset = 1 
    var floatBytes : UInt32 = (UInt32(bytes[byteOffset]) << 24) 
    floatBytes |= (UInt32(bytes[byteOffset+1]) << 16) 
    floatBytes |= (UInt32(bytes[byteOffset+2]) << 8) 
    floatBytes |= UInt32(bytes[byteOffset+3]) 

    return Float(bitPattern: floatBytes) 
} 

を。私はバイトをUnsafeBufferPointer<UInt32>にキャストしようとしましたが、コンパイラはそれを好まないのです。

欠けているこのビットパターンを抽出するクリーナーの方法はありますか?

おかげ

答えて

2

可能溶液:

let byteOffset = 1 
let result = Data(bytes: floatData[byteOffset..<byteOffset+4]).withUnsafeBytes { 
    (ptr: UnsafePointer<UInt32>) in 
    Float(bitPattern: UInt32(bigEndian: ptr.pointee)) 
} 
print(result) // 1.5 

Dataオブジェクトが配列スライスから作成され、そして クロージャはデータへのポインタと呼ばれます。 ptr.pointeeはデータを逆参照し、UInt32(bigEndian:) をホストバイトオーダーに変換します。

関連する問題