【问题标题】:How to copy data from Pointer to Pointer in C#?如何在 C# 中将数据从指针复制到指针?
【发布时间】:2020-02-26 02:20:09
【问题描述】:

我正在转换旧版 C++ 代码,需要 C# 中等效的 memcpy_s 的帮助。我需要将一个指针中的数据复制到另一个指针,如此 C++ 代码中所示。

我根据谷歌尝试了 C++ CopyMemory、Array.Copy 和其他方法,但它们似乎都没有帮助。我想在 C# 中转换下面显示的以下代码的等效项。任何帮助将不胜感激。

memcpy_s((char*)pDIB + sizeof(BITMAPINFOHEADER), bmpHeader.biSizeImage,
            pRawData, bmpHeader.biSizeImage);

此代码获取指针并添加 BITMAPHeader 的大小并向其添加另一个指针数据。我在 C# 中没有看到任何 Marshal.PointerToPointer 并且不知道如何编写。

【问题讨论】:

  • 建议:不要按字面翻译代码。 You wind up with garbage all too often,而且运行的程序几乎总是很差。要获得好的结果,您需要做的是充分了解源程序的行为,并在新语言中重新实现该行为,充分利用该新语言的结构、库和习语。
  • 如果您要远离 C++,最好使用 C#/.NET 的处理方式重写代码,而不是尝试使用指针和这样,否则您不妨将代码留在 C++ 中。
  • 例如,如果 .Net 库还没有您可以使用的位图文件读取器/写入器,我会感到非常惊讶。
  • 这段代码是获取指针并添加 BITMAPHeader 的大小并为其添加另一个指针数据 -- 您需要在更高层次上理解代码。您的 C++ 代码显示了 C 或 C++ 中的低级 BMP 处理。对于 .NET 语言没有必要去低级,因为处理图像和位图应该在一个或多个 .NET 类中可用。
  • 看起来您正在从位图结构复制原始图像数据。此数据将在 C# 中存储为字节数组,因此请使用 Array.Copy()

标签: c# c++ .net unmanaged


【解决方案1】:

您无需担心 C# 中的指针,一切都是托管的!

如果您尝试使用位图数据,请使用托管Bitmap 类并使用设置为原始字节数据的流创建位图。或者,您可以使用 BitmapSource 类。

如果您正在实际上仍在与非托管代码交互并尝试将数据输入和输出,您可以使用GCHandle 和固定缓冲区。但是,如果您将某些东西转换为纯 C#,您应该能够完全放弃指针。只需将它们视为对象实例和架构师......

【讨论】:

  • 我会说你不必担心指针。你仍然可以用它们来搞砸一个程序,只是难度更大,频率更低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2013-01-08
  • 1970-01-01
  • 2021-07-13
  • 2018-04-22
  • 2021-11-17
相关资源
最近更新 更多