Nis*_*air 3 floating-point int byte 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)
Run Code Online (Sandbox Code Playgroud)
Float到NSData:
var float1 : Float = 40.0
let data = NSData(bytes: &float1, length: sizeofValue(float1))
print(data) // <00002042>
Run Code Online (Sandbox Code Playgroud)
...然后回到Float:
var float2 : Float = 0
data.getBytes(&float2, length: sizeofValue(float2))
print(float2) // 40.0
Run Code Online (Sandbox Code Playgroud)
(这同样适用于其他“简单”类型,例如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 { $0.pointee } as Float
print(float2) // 40.0
Run Code Online (Sandbox Code Playgroud)
(另请参阅往返 Data 的往返 Swift 数字类型)
Swift 4及更高版本的更新:
var float1 : Float = 40.0
let data = Data(buffer: UnsafeBufferPointer(start: &float1, count: 1))
let float2 = data.withUnsafeBytes { $0.load(as: Float.self) }
print(float2) // 40.0
Run Code Online (Sandbox Code Playgroud)
备注: load(as:)要求数据正确对齐,因为Float这将在 4 字节边界上。请参阅往返 Swift 数字类型到/来自数据的其他适用于任意对齐数据的解决方案。
小智 6
斯威夫特 5解决方案
从Float到[UInt8]
extension Float {
var bytes: [UInt8] {
withUnsafeBytes(of: self, Array.init)
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
let number: Float = 36.5
let bytes = number.bytes
Run Code Online (Sandbox Code Playgroud)
从[UInt8]到Float
bytes.withUnsafeBytes {
$0.load(fromByteOffset: 0, as: Float.self)
}
Run Code Online (Sandbox Code Playgroud)
要转换为数据,只需将字节数组转换为Data
let data = Data(bytes)
Run Code Online (Sandbox Code Playgroud)