2011-05-12 29 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个字节。 –