我正在将一些代码从C ++转换为C#,我需要了解如何处理这些行:
PDWORD rgb32_data = (PDWORD) malloc(640*480*4);
据我所知,PDWORD
类型表示无符号整数(32位)。实现类似结构的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。
答案 0 :(得分:5)
根据MSDN,PDWORD
定义为:
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可能是一种替代品,但我们需要了解它将如何使用。您是自己访问内存还是将其传递给另一个非托管函数?