gpt4 book ai didi

arrays - 如何在 Swift 中将 Floats 的 ContiguousArray 转换为字节数组?

转载 作者:行者123 更新时间:2023-12-05 02:10:14 26 4
gpt4 key购买 nike

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

有没有一种优雅的方法可以将 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($0) }
print(byteArray) // [0, 0, 128, 63, 0, 0, 0, 64]

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

let byteArray = floatArray.withUnsafeBytes(Array.init)

字节数组包含以主机字节顺序表示的 float 的二进制表示(在所有当前 Apple 平台上都是小尾数法)。可以转换为大端字节序,但如果没有到整数数组的中间副本则不行:

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]

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

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

关于arrays - 如何在 Swift 中将 Floats 的 ContiguousArray 转换为字节数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58981455/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com