2011-05-12 60 views
3

我有一個實際上來自聲卡的16位樣本的字節數組。所以1000字節實際上代表500個短(16位值)。將字節數組轉換爲短褲數組而不復制數據

目前我將它們轉換是這樣的:

byte [] inputData = new byte[1000]; 
short [] convertedData = new short[500]; 
Buffer.BlockCopy(inputData, 0, convertedData , 0, 1000); 

它工作正常,這是相當快,因爲​​它是一個低級別的字節複製。

但是有沒有辦法做到這一點沒有副本?即告訴C#將此區域的內存視爲500個短而不是1000個字節的數組?我知道在C/C++中,我只需要投射指針就可以工作。

此副本發生在一個緊密的循環中,每秒高達5000次,所以如果我可以刪除副本,這將是值得的。

回答

8

StructLayout,您可以控制類或結構的數據字段的物理佈局。它通常用於與非託管代碼進行交互,這些代碼需要特定佈局中的數據。

試試這個:

[StructLayout(LayoutKind.Explicit)] 
struct UnionArray 
{ 
    [FieldOffset(0)] 
    public Byte[] Bytes; 

    [FieldOffset(0)] 
    public short[] Shorts; 
} 

static void Main(string[] args) 
{ 
    var union = new UnionArray() {Bytes = new byte[1024]}; 

    foreach (short s in union.Shorts) 
    { 
     Console.WriteLine(s); 
    } 
} 
+0

完美的伎倆,歡呼! –

2

也許一個C# analog的C語言union會做的伎倆。

-2
bytes[] inputData = Array.ConvertAll<short, bytes>(bytes, delegate(short[] convertedData) { return short.Parse(convertedData); }); 

類似的東西,我沒有檢查,但也許這會幫助你:)

+0

這是非常低效的,因爲它創建的每個調用它一個新的短陣。至少Buffer.BlockCopy讓我重新使用相同的數組。另外你必須結合2個字節來縮短1個字節。 –