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次,所以如果我可以删除副本,那将是值得的.
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)