将一段代码从c ++转换为c#

时间:2011-12-21 21:43:49

标签: 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[]

由于

3 个答案:

答案 0 :(得分:2)

我认为你想使用5-arg版本的Array.Copy,它允许你将偏移量传递到起始和目标数组。与指针算法相反,这是更“C#”的做事方式。

答案 1 :(得分:2)

在C ++中,您可以向指针添加DWORD(实际上是int),编译器知道将指针的地址偏移指定的量。通常,C#不会让你这样做。 (有一种方法可以在C#中进行指针运算,但是没有。)因此,在C#版本中,您需要另一种方法来相对于p的开头在偏移b处进行复制。 Array.Copy的一个重载会让你这样做。类似的东西:

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

答案 2 :(得分:0)

您可能需要查看:How to split a byte array,因为这实际上是您尝试使用b+p部分完成的内容。