如何在Swift中将一个连续的浮点数组转换成一个字节数组?

How to convert an ContiguousArray of Floats into a byte array in Swift?

我正在尝试将浮点数的 ContiguousArray 转换为 Swift 中的字节数组,但无法找到不使用 for 循环的智能方法。我一直在关注以前的帖子,例如 How to convert a double into a byte array in swift?,但如果不逐个迭代地获取每个元素,我将无法检索数组的内容。

有没有一种优雅的方法可以直接"copy" ContiguousArray 的字节直接到字节数组?

PS:我已经成功实现了将结构转换为字节数组,但无法对数组执行同样的操作。

您可以使用 withUnsafeBytes() 方法获取指向数组连续存储的底层字节的缓冲区指针,并直接从该缓冲区指针初始化一个 [UInt8] 数组。示例:

let floatArray: [Float] = [1.0, 2.0]
// Works also with a ContiguousArray:
// let floatArray: ContiguousArray<Float> = [1.0, 2.0]

let byteArray = floatArray.withUnsafeBytes { Array([=10=]) }
print(byteArray) // [0, 0, 128, 63, 0, 0, 0, 64]

等价地(根据 Leo 的建议):

let byteArray = floatArray.withUnsafeBytes(Array.init)

字节数组包含主机字节顺序浮点数的二进制表示(在所有 current Apple 平台上都是小端)。可以转换为大端字节序,但必须要有一个整数数组的中间副本:

let floatArray: ContiguousArray<Float> = [1.0, 2.0]
let intArray = floatArray.map { [=12=].bitPattern.bigEndian }
let byteArray = intArray.withUnsafeBytes(Array.init)
print(byteArray) // 63, 128, 0, 0, 64, 0, 0, 0]

反向转换:一个简单的方法是

let floatArray2 = byteArray.withUnsafeBytes { Array([=13=].bindMemory(to: Float.self)) }
print(floatArray2) // [1.0, 2.0]

但是,这要求字节数组的元素存储对于浮点数正确对齐。如果不能保证那么你可以做

var floatArray2 = [Float](repeating: 0.0, count: byteArray.count / MemoryLayout<Float>.stride)
_ = floatArray2.withUnsafeMutableBytes { byteArray.copyBytes(to: [=14=]) }
print(floatArray2) // [1.0, 2.0]