2011-12-21 58 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