如何将 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)
Float
到 NSData
:
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
(同样适用于其他“简单”类型,如 Double
,
Int
, ...)
更新 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)
我用来获取字节数据的代码,但我没有得到正确的浮点值字节数据
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)
Float
到 NSData
:
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
(同样适用于其他“简单”类型,如 Double
,
Int
, ...)
更新 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)