c# - 在 C# 中转换/移植 PDWORD 代码

标签 c# c++ arrays integer

我正在将一些代码从 C++ 转换为 C#,我需要一些关于如何处理这些行的见解:

PDWORD rgb32_data = (PDWORD) malloc(640*480*4);

据我了解,PDWORD 类型表示无符号整数(32 位)。实现类似结构的良好 C# 策略是什么?

编辑:我发现我需要使用 IntPtr 来替换 PDWORD,但 IntPtr 将保存单个值而不是数组中的多个值。有任何 C# 建议吗?

EDIT2:Uint[]s 对我不起作用 - 不幸的是,我可以编译程序及其所有依赖项的唯一方法是输入 IntPtr 作为参数,而不是 IntPtr[]。

谢谢。

编辑 - 我已经标记了解决方案,此外我还需要执行以下操作:

因为我需要一个 IntPtr 转换,所以我添加了这段代码

        IntPtr rgb32_ptr; 
        GCHandle handle = GCHandle.Alloc(rgb32_data, GCHandleType.Pinned);
        try
        {
            rgb32_ptr = handle.AddrOfPinnedObject();
        }
        finally
        {
            if (handle.IsAllocated)
            {
                handle.Free();
            }
        }

得到一个相同的 IntPtr。

最佳答案

根据 MSDN , PDWORD 定义为:

typedef DWORD*  PDWORD;

所以它是一个指向 DWORD 的指针,MSDN also says是一个无符号的 32 位整数 - 换句话说,一个 uint

请注意,您的 C++ 代码行为 640 * 480 = 307,200 个 DWORD 的数组分配了内存。

你可以直接翻译成:

uint[] rgb32_data = new uint[640 * 480];

但代码可能真的想将它用作内存中的一系列字节,因此您可能想要使用字节数组

byte[] rgb32_data = new byte[640 * 480 * 4];

并使用 BitConverter class 中的方法(尤其是 ToInt32() 方法)如果您认为这更接近原始程序处理数据的方式。

关于c# - 在 C# 中转换/移植 PDWORD 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656816/

相关文章:

c# - 当我将其名称作为字符串时,如何执行方法

c# - 在 .net 中处理大量 TCP 客户端连接

c# - Visual Studio 2010 中的错误/奇怪的 For-Loop 行为?

c# - 获取 NullReferenceException 的 Null 对象

c++ - 创建一个 const shared_ptr<pure virtual class> 成员

c++ - 为什么必须在何处以及为什么要放置"template"和"typename"关键字?

php - 如何用多维数组填充表

c++ - 这段 C++ 代码有什么问题?它在运行时崩溃

arrays - 将空间分隔的整数存储到数组中的更整洁的方法?

c++ - 检查两个数组是否相同的函数