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

本文关键字:c++ 转换 代码 一段 | 更新日期: 2023-09-27 18:18:37

我正在尝试将代码从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[]

谢谢

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

我认为你想使用5-arg版本的Array。Copy,它允许您将偏移量传递到开始和目标数组中。与指针运算相比,这是一种更"c#"的操作方式。

在c++中,可以向指针添加DWORD(实际上是int),编译器知道将指针的地址偏移指定的量。c#通常不允许这样做。(c#中有一种方法可以做指针运算,但不要这样做。)因此,在c#版本中,您需要另一种方法来复制相对于b开始的偏移量p。Array的重载之一。Copy会让你这样做。比如:

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

您可能想看看:如何分割字节数组,因为这实际上是您试图用b+p部分完成的。