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 intunsigned long 的类型。它们有 uintulong,但它们的含义与 C++ 中的 unsigned intunsigned long 截然不同。具体来说,C# 类型具有标准指定的位大小,而 C++ 类型可能因平台而异,事实证明,在 Microsoft 的编译器中,unsigned intunsigned 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# 等价物是啥?的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 <map> 的 C# 等价物是啥? [复制]

Linux 下 AutoResetEvent 的 C++ 等价物是啥?

Python 中 C# 的 GetBytes() 等价物是啥?

非托管代码中 System.Diagnostics.Debugger.Launch() 的等价物是啥?

java.util.regex 的 C# 等价物是啥?

这个 C# RSACryptoServiceProvider 方法的红宝石等价物是啥