如何将UnsafePointer映射到另一种类型?

3

我正试图将一个UnsafePointer<UInt16>转换成一个UnsafePointer<Float>,目前为止我得到了以下解决方案:

let bufferSize = 1024
let buffer: UnsafePointer<UInt16> = ....
let tmp = UnsafeBufferPointer(start: buffer, count: bufferSize).map(Float.init)
let converted: UnsafePointer<Float> = UnsafePointer(tmp)

它可以工作,但我感觉这不是一种高效的方法,因为我正在创建一个中间的Array... 有没有更好的方法来处理这个问题?


2
你的代码将每个UInt16映射到一个(32位)浮点数。如果这是你的意图,那么需要一个新的缓冲区。或者,你想要重新解释缓冲区,例如将1024个UInt6值解释为512个浮点数? - Martin R
@MartinR 我的意图是将每个UInt16映射到一个(32位)浮点数。 - klefevre
1
那么,你需要一个新的数组,因为浮点数占用的空间是整数的两倍,你不能只是“转换指针”。 - Martin R
1个回答

1
你可以使用withMemoryRebound将指针从一种类型转换为另一种类型:
buffer.withMemoryRebound(to: Float.self, capacity: 1024) { converted -> Void in
    // use `converted` here
}

但要注意,MemoryLayout<Float>.size4(即32位),MemoryLayout<UInt16> 显然是 2(即16位),因此您的 Float 缓冲区的 bufferSize 将是您的 UInt16 缓冲区的一半。


谢谢,我没有考虑到那个。 - klefevre
在我的情况下似乎不起作用,因为内存重绑定是针对整个缓冲区而不是每个值进行的。 - klefevre
没错。你的问题最初是关于转换指针,但现在看起来你想要转换整个缓冲区。 - Rob
@klefevre - 要做到这一点,我们可能需要知道您想将UInt16缓冲区转换为Float的方式。也许编辑您的问题,向我们展示在此过程中数据如何转换的几个示例。或者,更好的是,给我们提供您正在尝试解决的问题的更广泛的背景。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接