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

时间:2011-05-12 13:27:35

标签: c# memory bytearray

我有一个字节数组,实际上是来自声卡的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次,所以如果我可以删除副本,那就值得。

3 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:2)

也许C语union的{​​{3}}可以解决问题。

答案 2 :(得分:-2)

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

类似的东西,我没有检查,但也许这会帮助你:)