我用于获取字节数据的代码,但没有获取浮点值的正确字节数据
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
...)
使用新Data
类型更新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
(另请参阅往返于数据的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
备注: load(as:)
要求数据正确对齐,因为Float
这将在4字节边界上。有关适用于任意对齐数据的其他解决方案,请参见例如往返于数据的Swift数类型往返。
Float(bitPattern: UInt32(bigEndian: data.withUnsafeBytes { $0.pointee } ))
浮点转换此数据有什么不同,因为它实际输出的是不同的值,实际上我需要反向操作,这意味着浮点转换为数据,但是您答案中的上述代码未按预期转换,请帮忙请注意,此处显示的Swift 3版本现在会使用Swift 5生成警告:
Initialization of 'UnsafeBufferPointer<Self>' results in a dangling buffer pointer
@featherless:我收到不同的警告“已弃用'withUnsafeBytes'”,并且我更新了代码。现在,它应该在没有警告的情况下进行编译。
感谢马丁的更新。新代码确实可以工作+编译,但是看起来它不能处理未对齐的数据。请参阅github.com/jverkoey/BinaryCodable/pull/58/files,了解我根据swift-nio的数字转换实现进行的修复:github.com/apple/swift-nio/blob/…
@featherless:正确,
load(as:)
要求数据正确对齐。(另请参阅Swift论坛中的forums.swift.org/t/built-in-unaligned-loads/19664。)对于任意对齐的数据,我在这里stackoverflow.com/a/38024025/1187415编写了一些内容,本质上是相同的方法就像在您的链接中一样。