将字节数组转换为short数组而不复制数据

Mat*_*ren 3 c# memory bytearray

我有一个字节数组,实际上是声卡的16位样本.因此,1000字节实际上代表500短(16位值).

目前我正在将它们转换为:

byte [] inputData = new byte[1000];
short [] convertedData = new short[500];
Buffer.BlockCopy(inputData, 0, convertedData , 0, 1000);
Run Code Online (Sandbox Code Playgroud)

它工作正常,它很快,因为它是一个低级字节副本.

但有没有办法在没有副本的情况下做到这一点?即告诉C#将这个内存区域视为500个短裤而不是1000个字节的数组?我知道在C/C++中我可以只是转换指针,它会起作用.

这个副本发生在一个紧密的循环中,每秒高达5000次,所以如果我可以删除副本,那将是值得的.

Yan*_*ton 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);
    }
}
Run Code Online (Sandbox Code Playgroud)