繁体   English   中英

如何在 Swift 中将浮点数的 ContiguousArray 转换为字节数组?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM