2011-05-12 2 views
3

실제로 사운드 카드의 16 비트 샘플 인 바이트 배열이 있습니다. 따라서 1000 바이트는 실제로 500 개의 Short (16 비트 값)를 나타냅니다. 데이터 배열을 복사하지 않고 short 배열로 변환

현재 나는이처럼 변환 해요 :

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

그것은 잘 작동하고 낮은 수준의 바이트 사본의로 꽤 빠르다.

그러나 사본이 없으면 어떻게 할 수 있습니까? 즉 C#에게이 메모리 영역을 1000 바이트가 아닌 500 개의 반바지로 처리하도록 알려주십시오. C/C++에서 포인터를 캐스팅 할 수 있다는 것을 알고 있습니다.

이 복사본은 초당 최대 5000 번 반복되는 루프에서 발생하므로 복사를 제거 할 수 있다면 가치가 있습니다.

답변

8

StructLayout 당신은 클래스 또는 구조의 데이터 필드의 실제 레이아웃을 제어 할 수 있습니다 : 당신을 도울 것입니다. 일반적으로 특정 레이아웃의 데이터를 예상하는 비 관리 코드와 상호 작용할 때 사용됩니다.

이 사용 해보세요 : 그것은 새로운 short 배열 당신이 그것을 호출 할 때마다 생성으로

[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); 
    } 
} 
+0

완벽한 트릭, 건배! –

2

아마도 의 C# analog이 트릭을 수행합니다. 그런

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

뭔가, 내가 확인 didnt는,하지만 어쩌면 그

+0

이 매우 비효율적이다. 적어도 Buffer.BlockCopy는 동일한 배열을 다시 사용하게합니다. 또한 2 바이트를 결합하여 1을 짧게 만들어야합니다. –

관련 문제