如何将 swift 中的浮点值转换为字节数组?

How to convert a float value to byte array in swift?

我用来获取字节数据的代码,但我没有得到正确的浮点值字节数据

let count = data.length / sizeof(UInt32)

// create array of appropriate length:
var array = [UInt32](count: count, repeatedValue: 0)

// copy bytes into array
data.getBytes(&array, length:count * sizeof(UInt32))

print(array)

FloatNSData:

var float1 : Float = 40.0
let data = NSData(bytes: &float1, length: sizeofValue(float1))
print(data) // <00002042>

...然后回到 Float:

var float2 : Float = 0
data.getBytes(&float2, length: sizeofValue(float2))
print(float2) // 40.0

(同样适用于其他“简单”类型,如 DoubleInt, ...)

更新 Swift 3, 使用新的 Data 类型:

var float1 : Float = 40.0
let data = Data(buffer: UnsafeBufferPointer(start: &float1, count: 1))
print(data as NSData) // <00002042>

let float2 = data.withUnsafeBytes { [=12=].pointee } as Float
print(float2) // 40.0

(另见

Swift4 及更高版本的更新:

var float1 : Float = 40.0
let data = Data(buffer: UnsafeBufferPointer(start: &float1, count: 1))

let float2 = data.withUnsafeBytes { [=13=].load(as: Float.self) } 
print(float2) // 40.0

备注: load(as:) 要求数据正确对齐,因为 Float 将位于 4 字节边界上。参见例如 适用于任意对齐数据的其他解决方案。

Swift 5

Float[UInt8]

extension Float {
   var bytes: [UInt8] {
       withUnsafeBytes(of: self, Array.init)
   }
}

用法:

let number: Float = 36.5
let bytes = number.bytes

[UInt8]Float

bytes.withUnsafeBytes {
    [=12=].load(fromByteOffset: 0, as: Float.self)
}

要转换为数据,只需将字节数组转换为 Data

let data = Data(bytes)