[英]How to convert an ContiguousArray of Floats into a byte array in Swift?
我正在尝试将浮点数的 ContiguousArray 转换为 Swift 中的字节数组,但如果不使用 for 循环就找不到聪明的方法。 我一直在关注以前的帖子,例如如何在 swift 中将双精度数转换为字节数组? ,但是如果不逐个迭代地获取每个元素,我将无法检索数组的内容。
有没有一种优雅的方法可以直接将 ContiguousArray 的字节直接“复制”到字节数组?
PS:我已成功实现将结构转换为字节 arrays,但无法对 arrays 执行相同操作。
您可以使用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($0) }
print(byteArray) // [0, 0, 128, 63, 0, 0, 0, 64]
等效地(基于 Leo 的建议):
let byteArray = floatArray.withUnsafeBytes(Array.init)
字节数组包含以主机字节顺序表示的浮点数的二进制表示(在所有当前Apple 平台上都是 little-endian)。 可以转换为大端序,但不能没有到 integer 数组的中间副本:
let floatArray: ContiguousArray<Float> = [1.0, 2.0]
let intArray = floatArray.map { $0.bitPattern.bigEndian }
let byteArray = intArray.withUnsafeBytes(Array.init)
print(byteArray) // 63, 128, 0, 0, 64, 0, 0, 0]
反向转换:一个简单的方法是
let floatArray2 = byteArray.withUnsafeBytes { Array($0.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: $0) }
print(floatArray2) // [1.0, 2.0]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.