2011-03-30 3 views
27

대리인이있는 .dll (내 소유가 아님)이 있습니다. 이 위임 콜백 기능은 다음과 같습니다
"CallBackFN (USHORT 연산 코드, 을 IntPtr 페이로드, UINT 크기, UINT LOCALIP)" C#에서 IntPtr에서 Byte []를 가져 오는 방법

어떻게 내가 IntPtr입니다 []를 바이트 변환 할 수 있습니까? 페이로드는 실제로 Byte []라고 생각합니다. 그것이 Byte []가 아니고 다른 것이 있다면 나는 어떤 데이터를 잃을까요?

+0

가능한 중복 : http://stackoverflow.com/questions/5298930/how-to-get-byte-from-intptr-in-c –

답변

5

this Stack Overflow question에 따르면, 당신이 할 수있는 사용할 수 있습니다

var byteArray = new byte[dataBlockSize]; 
System.Runtime.InteropServices.Marshal.Copy(payload, byteArray, 0, dataBlockSize); 
+0

downvoter가 설명해 주길 바래요? –

33

경우의 바이트 :

byte[] managedArray = new byte[size]; 
Marshal.Copy(pnt, managedArray, 0, size); 

는 바이트가 아니라면, Marsha의 크기 매개 변수 l.Copy는 배열의 요소 수이며 바이트 크기는 아닙니다. 따라서, byte [] 배열이 아닌 int [] 배열이 있다면, 콜백을 통해 전달 된 size 매개 변수가 참조하는 것으로 가정하면, 복사 할 요소의 정확한 수를 얻기 위해 4로 나누어야합니다 (int 당 바이트). 바이트 수. 성능이 필요하면

+0

감사. 나는 이것이 이것이라고 생각한다. 배열이 바이트가 아니면 대답의 첫 번째 절반에 대해 "크기" – Gabriel

+0

+1을 변경하려고합니다. 정말로, 나머지 절반은 ... 나는 그것을 읽지도 않았다. :) – Bitterblue

12

, 직접 사용

unsafe { 
    byte *ptr = (byte *)buffer.ToPointer(); 

    int offset = 0; 
    for (int i=0; i<height; i++) 
    { 
     for (int j=0; j<width; j++) 
     { 

      float b = (float)ptr[offset+0]/255.0f; 
      float g = (float)ptr[offset+1]/255.0f; 
      float r = (float)ptr[offset+2]/255.0f; 
      float a = (float)ptr[offset+3]/255.0f; 
      offset += 4; 

      UnityEngine.Color color = new UnityEngine.Color(r, g, b, a); 
      texture.SetPixel(j, height-i, color); 
     } 
    } 
} 
관련 문제