将字节数组转换为短整型数组而无需复制数据

3

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

目前,我是这样转换它们的:

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

它可以正常工作,因为它是一个低级别的字节复制,所以速度相当快。

但是,有没有一种方法可以在不进行复制的情况下完成呢?也就是说,告诉C#将这段内存区域视为500个shorts的数组,而不是1000个字节?我知道在C/C++中,我可以直接将指针转换类型即可实现。

这个复制操作在一个紧密的循环中发生,每秒高达5000次,如果我能够避免这个复制,那么它将是值得的。

3个回答

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);
    }
}

2
也许 C# 语言中的 union类比 可以解决这个问题。

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

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


这样做非常低效,因为每次调用它都会创建一个新的短数组。至少Buffer.BlockCopy让我可以重复使用同一个数组。此外,您必须将2个字节组合成1个短整型。 - Matt Warren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接