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

如何在swift中将浮点值转换为字节数组?,swift,floating-point,int,byte,Swift,Floating Point,Int,Byte,我用来获取字节数据的代码,但是我没有得到正确的浮点值字节数据 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)) p

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

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>
(这同样适用于其他“简单”类型,如
Double
Int
,…)

使用新的
数据更新Swift 3,类型:

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

备注:
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 {
    $0.load(fromByteOffset: 0, as: Float.self)
}
要转换为数据,只需将字节数组转换为
Data

let data = Data(bytes)

输入数据到底是什么?预期结果是什么?标题是“将浮点值转换为字节数组”,而您的代码是“NSData转换为UInt32数组”,因此您的问题对我来说并不清楚:)您好,谢谢您的回复,如果我有浮点值,我想将浮点值转换为字节。让我知道我该怎么做?请举个例子?您想要IEEE 754表示法还是二进制的
integer.fraction
表示法?假设浮点值为40.0,我希望此浮点值在NSData中转换,然后反过来NSData也转换为浮点。
float(位模式:UInt32(bigEndian:data.withUnsafeBytes{$0.pointee}))
这个数据到浮点的转换有什么不同,因为它输出的是不同的值,实际上我需要的是相反的,这意味着浮点到数据,但您答案中的上述代码并没有按照预期进行转换,请帮助注意,此处显示的Swift 3版本现在使用Swift 5生成警告:
初始化'UnsafeBufferPointer'会导致缓冲区指针悬空
@featherless:我收到不同的警告“'withUnsafeBytes'已弃用”,我已更新代码。它现在应该在没有警告的情况下编译。感谢您的更新。新代码确实可以在编译时工作,但看起来它不能处理未对齐的数据。请参阅我根据swift nio的数字转换实现进行的修复:@featherless:没错,
load(as:)
要求数据正确对齐。(另请参见Swift论坛)对于任意对齐的数据,我在这里写了一些东西,基本上与链接中的方法相同。
bytes.withUnsafeBytes {
    $0.load(fromByteOffset: 0, as: Float.self)
}
let data = Data(bytes)