2011-12-21 3 views
0

으로 변환합니다. 코드를 C++에서 C#으로 변환하려고하는데, 막혔습니다. 누군가 내가 내가 틀린 곳을 알려주실 수 있습니까? 내가 제대로 해냈다했다 확실하지 않다코드 조각을 C++에서 C#

void CALLBACK Test(void *buffer, DWORD length) 
{ 
    BYTE *b=(BYTE*)buffer, temp[20000]; 
    DWORD p=0; 
    while (p<length) 
    { 
    DWORD c=min(length-p, sizeof(temp)); 
    memcpy(temp, b+p, c); 
    c=SendData(dummy, temp, c); 
    if (c==-1) break; 
    p+=c; 
    } 
} 

where is SendData(int, byte[], int) 

그리고 현재의 C# 코드

void Test(IntPtr buffer, int length) 
{ 

     byte[] temp = new byte[20000]; 
     byte[] b = new byte[length]; 
     Marshal.Copy(buffer, b, 0, length); 

    long p=0; 
    while (p<length) 
    { 
    long c=Math.Min(length-p, 20000); 
    Array.Copy(temp, b+p, c); 
    c=SendData(dummy, temp, (int)c); 
    if (c==-1) break; 
    p+=c; 
    } 
} 

하지만이기 때문에 나는 b+s에 운영자 +를 적용 할 수 없습니다 볼 수 있습니다

C++ 코드는 longbyte[].

감사

+10

"리터럴"변환 대신, 함수가 무엇을하는지 확인하고 C#에서 다시 작성하는 것이 더 좋다고 생각하지 않습니까? –

답변

2

당신은 시작과 목적지 배열 모두에 오프셋을 전달할 수있는 Array.Copy의 5-arg 버전을 사용하고 싶습니다. 이것은 포인터 산술과 반대되는 일을하는 "C#"방식입니다.

0

당신이보고 할 수 있습니다 : 그것은 당신이 b+p 부분 달성하기 위해 시도하고있는 무슨 효과가 있기 때문에, How to split a byte array.

2

C++에서는 DWORD (int, 실제로)를 포인터에 추가 할 수 있으며 컴파일러는 포인터의 주소를 지정된 양만큼 오프셋하는 것을 알고 있습니다. C#에서는 그렇게 할 수 없습니다. (C#에서 포인터 연산을하는 방법이 있지만 그렇지 않습니다.) 따라서 C# 버전에서는의 시작 위치에 상대적인 오프셋 p에서 복사 할 다른 방법이 필요합니다. Array.Copy의 과부하 중 하나는 그렇게 할 것입니다. 예 :

+0

C#에서 포인터에 대해 아무 것도하지 않습니다. 코드를 수행하는 속도가 빨라지고 C++ 코드가 C# 코드로 변환 될 수 있습니다. (예 : 이미지 처리, 이미지 로딩, ...) 물론 당신은 실제로 무엇을하고 있는지 알아야합니다. –

관련 문제