【问题标题】:Convert piece of code from c++ to c#将一段代码从 c++ 转换为 c#
【发布时间】:2012-01-25 16:13:42
【问题描述】:

我正在尝试将代码从 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# c++


【解决方案1】:

我认为您想使用 Array.Copy 的 5 参数版本,它允许您将偏移量传递到起始和目标数组中。与指针运算相比,这是更“C#”的处理方式。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 在 C# 中没有反对指针,当您知道自己在做什么时,有时可以大大加快代码速度并将 C++ 代码转换为 C# 代码。 (例如图像处理、图像加载……)当然你应该知道你在做什么。
    【解决方案3】:

    您可能想查看:How to split a byte array,因为这实际上是您尝试使用 b+pportion 完成的任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-02
      • 1970-01-01
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      相关资源
      最近更新 更多