我有一个字节数组,实际上是来自声卡的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次,所以如果我可以删除副本,那就值得。
答案 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); } );
类似的东西,我没有检查,但也许这会帮助你:)