转换/端口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。
根据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);
}
}
ref uint32
。或者IntPtr
(如果您在32位运行时(。
这取决于你将如何使用它。如果你将它传递给非托管代码,那么我建议使用ref UInt32
。如果您将其用于内存分配(例如,分配内存的Windows API函数的返回值(,那么您需要使用IntPtr
。
对于DWORD本身,可以使用System.UInt32作为等效项。Marshal.AllocHGlobal可能是一个替代品,但我们需要看看它将如何使用。您是自己访问内存,还是将其传递给另一个非托管函数?