2011-12-21 55 views
0

我試圖從C++轉換代碼到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,因爲它是longbyte[]

感謝

+10

而不是做一個「文字」轉換,你不認爲這是更好的看看這個函數做什麼,並重新在C#中做? – 2011-12-21 21:45:42

回答

2

我想你想使用Array.Copy的5-arg版本,它可以讓您將偏移量傳遞到開始和目標數組。與指針算術相比,這是更「C#」的做事方式。

2

在C++中,您可以向指針添加一個DWORD(一個int),並且編譯器知道將指針的地址偏移指定的量。通常,C#不會讓你這樣做。 (有一種方法可以在C#中進行指針運算,但不要)。因此,在C#版本中,需要使用另一種方法在相對於b開頭的偏移量p處進行復制。 Array.Copy的重載之一會讓你這樣做。就像:

Array.Copy(temp, 0, b, p, c); 
+0

對C#中的指針沒有任何反應,當你知道你在做什麼時,你可以加快代碼的速度,並將C++代碼翻譯成C#代碼。 (例如圖像處理,圖像加載等)當然,你應該真的知道你在做什麼。 – 2011-12-21 21:58:00