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

本文关键字:PDWORD 代码 中的 端口 转换 | 更新日期: 2023-09-27 17:49:59

我正在将一些代码从C++转换为C#,我需要了解如何处理以下行:

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

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

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

第2版:Uint[]对我不起作用——不幸的是,我能编译程序及其所有依赖项的唯一方法是输入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。

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

根据MSDN,PDWORD定义为:

typedef DWORD*  PDWORD;

因此,它是一个指向DWORD的指针,MSDN也说它是无符号的32位整数,换句话说,是一个uint

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

您可以直接将其翻译为:

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

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

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

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

您可以使用不安全的指针和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);
        }
    }
PDWORD是一个指向32位无符号整数的指针。在C#中,这将是ref uint32。或者IntPtr(如果您在32位运行时(。

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

PDWORD是指向DWORD的指针。根据代码的使用方式,有几个选项可以将代码转换为C#。

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