我正在将一些代码从 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/