2014-11-17 20 views
5

Tôi đang tìm một cách mạnh mẽ và thanh lịch để trích xuất bốn byte lớn từ một mảng dưới dạng Float.Swift: trích xuất float từ dữ liệu byte

tôi có thể có được một UInt32 với các bit thông qua một cái gì đó như thế này:

let data: [Byte] = [0x00, 0x00, 0x00, 0x40, 0x86, 0x66, 0x66, 0x00] 
let dataPtr = UnsafePointer<Byte>(data) 
let byteOffset = 3 
let bits = UnsafePointer<UInt32>(dataPtr + byteOffset)[0].bigEndian 

Nhưng tôi không thể tìm ra một cách tốt để chuyển đổi này vào một phao trong Swift.

Ví dụ, trong Java:

float f = Float.intBitsToFloat(bits) 

hoặc trong C:

float f = *(float *)&bits; 

tôi đã cố gắng đúc các dataPtr đến một phao UnsafePointer, nhưng sau đó endianness là một vấn đề.

Mọi đề xuất?

Trả lời

5

Các loại điểm động có một số _fromBitPattern tĩnh sẽ trả về một giá trị. <Type>._BitsType là một loại bí danh đến số nguyên unsigned kích thước chính xác:

let data: [Byte] = [0x00, 0x00, 0x00, 0x40, 0x86, 0x66, 0x66, 0x00] 
let dataPtr = UnsafePointer<Byte>(data) 
let byteOffset = 3 
let bits = UnsafePointer<Float._BitsType>(dataPtr + byteOffset)[0].bigEndian 
let f = Float._fromBitPattern(bits) 

Bạn không thấy rằng phương pháp trong tự động hoàn thành, nhưng đó là một part of the FloatingPointType protocol. Có một phương pháp thể hiện sẽ cung cấp cho bạn các bit, được gọi là ._toBitPattern().

+0

Đó là tốt hơn ... –

+0

Vâng, thậm chí rõ ràng hơn. Cảm ơn! – NickHowes

4

Mã Swift tương đương là

let flt = unsafeBitCast(bits, Float.self) 

mang đến cho 4.2 với dữ liệu của bạn.

0

Đây là giải pháp cho Swift 3:

Float(bitPattern: bits) 
Các vấn đề liên quan