在C#中转换/端口PDWORD代码

时间:2011-04-13 23:16:30

标签: 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。

4 个答案:

答案 0 :(得分:5)

根据MSDNPDWORD定义为:

typedef DWORD*  PDWORD;

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

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

您可以将其直接翻译为:

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

但是代码可能真的想将它用作内存中的一系列字节,所以你可能想要使用字节数组

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

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

答案 1 :(得分:2)

您可以使用不安全的指针和Marshal.AllocHGlobal()

    Program()
    {            
        unsafe
        {
            IntPtr ptr = Marshal.AllocHGlobal(640 * 480 * 4);

            uint* ptr2 = (uint*)ptr.ToPointer();

            for (int i = 0; i < 640*480; i++)
            {
                ptr2[i] = 0;
            }

            Marshal.FreeHGlobal(ptr);
        }
    }

答案 2 :(得分:1)

PDWORD是指向32位无符号整数的指针。在C#中,这将是ref uint32。如果您使用的是32位运行时,请IntPtr

这取决于你将如何使用它。如果您将其传递给非托管代码,那么我建议使用ref UInt32。如果您正在使用它进行内存分配(例如,来自分配内存的Windows API函数的返回值),那么您需要使用IntPtr

答案 3 :(得分:0)

PDWORD是指向DWORD的指针。有几个选项可以将代码转换为C#,具体取决于它的使用方式。

对于DWORD本身,您可以使用System.UInt32作为等效项。 Marshal.AllocHGlobal可能是一种替代品,但我们需要了解它将如何使用。您是自己访问内存还是将其传递给另一个非托管函数?