2017-06-30 50 views
3

我想轉換一個UnsafePointer<UInt16>UnsafePointer<Float>,到目前爲止我用這個解決方案結束:如何將UnsafePointer映射到另一個類型?

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浮點值? –

+0

@MartinR我的意圖是將每個UInt16映射到(32位)Float。 – klefevre

+1

那麼,你*需要*一個新的數組,因爲浮動需要兩倍的空間,你不能只是「轉換指針」。 –

回答

1

您可以使用withMemoryRebound的指針從一種類型轉變爲另一種:

buffer.withMemoryRebound(to: Float.self, capacity: 1024) { converted -> Void in 
    // use `converted` here 
} 

但要小心MemoryLayout<Float>.size4(即32位)和MemoryLayout<UInt16>顯然是2,所以(即16位)。您的FloatbufferSize將是您的UInt16緩衝區的一半。

+0

謝謝我沒有想到這一點。 – klefevre

+0

看來,在我的情況下它不起作用,因爲內存反彈是在整個緩衝區上完成的,而不是在每個值上。 – klefevre

+0

這是正確的。你的問題談到了轉換指針,但它現在聽起來像你想轉換整個緩衝區。 – Rob

相關問題