C++ DWORD 的 C# 等价物是啥?
Posted
技术标签:
【中文标题】C++ DWORD 的 C# 等价物是啥?【英文标题】:What is the C# equivalent of C++ DWORD?C++ DWORD 的 C# 等价物是什么? 【发布时间】:2016-10-10 04:51:04 【问题描述】:经过搜索,我听说 UInt32 是 C# 的 C++ DWORD 等价物。 我通过算术测试了结果
*(DWORD*)(1 + 0x2C) //C++
(UInt32)(1 + 0x2C) //C#
它们产生完全不同的结果。有人可以告诉我 C# 中 DWORD 的正确匹配吗?
【问题讨论】:
它们绝对不会从算术方面产生完全不同的结果,但我认为你误解了 C++ 代码......而且 C++ 没有 DWORD 的概念,你可能正在混合 Windows 定义. 【参考方案1】:您的示例使用DWORD
作为指针,这很可能是无效指针。我假设您的意思是 DWORD
本身。
DWORD
定义为unsigned long
,最终是一个 32 位无符号整数。
uint
(System.UInt32
) 应该是匹配的。
#import <stdio.h>
// I'm on macOS right now, so I'm defining DWORD
// the way that Win32 defines it.
typedef unsigned long DWORD;
int main()
DWORD d = (DWORD)(1 + 0x2C);
int i = (int)d;
printf("value: %d\n", i);
return 0;
输出:45
public class Program
public static void Main()
uint d = (uint)(1 + 0x2C);
System.Console.WriteLine("Value: 0", d);
输出:45
【讨论】:
System.UInt32
是 64 位无符号整数?如果这是真的,那真是个不幸的名字。
@BenjaminLindley 不,这是一个错字,抱歉
@StephenJennings 那么ulong (System.UInt64)
应该匹配吗?
@Sphynx 不,C++ 中的无符号长整数是 32 位无符号整数,我链接到的文档确认 DWORD 是 32 位无符号整数。和 C# 中的 ulong 不一样,是 64 位无符号整数。【参考方案2】:
来自微软的 DWord 定义:
typedef unsigned long DWORD, *PDWORD, *LPDWORD; https://msdn.microsoft.com/en-us/library/cc230318.aspx
来自微软的 Uint32 定义
typedef unsigned int UINT32; https://msdn.microsoft.com/en-us/library/cc230386.aspx
现在你可以看到区别了……一个是 unsigned long,另一个是 unsigned int
【讨论】:
您链接到的页面是针对 C++ 类型 UINT32,而不是针对 C# 类型 UInt32。 是的。但微软将保持其底层定义正确 C# 没有名为unsigned int
或 unsigned long
的类型。它们有 uint
和 ulong
,但它们的含义与 C++ 中的 unsigned int
和 unsigned long
截然不同。具体来说,C# 类型具有标准指定的位大小,而 C++ 类型可能因平台而异,事实证明,在 Microsoft 的编译器中,unsigned int
和 unsigned long
的大小相同。
“unsigned int 和 unsigned long 大小相同”。它不会因 64 位和 32 位架构而异吗?
这令人困惑。那么unsigned long
是 32 位的吗?链接说:“DWORD 是一个 32 位无符号整数” 然后输入:typedef unsigned long DWORD, *PDWORD, *LPDWORD;
【参考方案3】:
你的两个 sn-ps 做的事情完全不同。在您的 C++ 代码中,出于某种奇怪的原因,您将值 (1 + 0x2C)
(写 45 的一种奇怪方式) 转换为 DWORD*
,然后取消引用它,就好像那个地址是实际上是一个有效的内存位置。使用 C#,您只需在整数类型之间进行转换。
【讨论】:
以上是关于C++ DWORD 的 C# 等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Linux 下 AutoResetEvent 的 C++ 等价物是啥?
Python 中 C# 的 GetBytes() 等价物是啥?