经过搜索,我听说UInt32是C++ DWORD的C#版。我通过执行算术来测试结果
*(DWORD*)(1 + 0x2C) //C++
(UInt32)(1 + 0x2C) //C#
它们会产生完全不同的结果。有没有人能告诉我C#中的DWORD的正确匹配项?
发布于 2016-10-10 05:07:11
您的示例使用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
发布于 2016-10-10 05:04:51
您的两个代码片段所做的事情完全不同。在C++代码中,出于某种奇怪的原因,您将值(1 + 0x2C)
(写入45的一种奇怪方式)转换为DWORD*
,然后取消对它的引用,就好像该地址实际上是一个有效的内存位置一样。使用C#,您只需在整数类型之间进行转换。
发布于 2016-10-10 05:08:32
来自微软的DWord定义:
类型定义f unsigned long DWORD,*PDWORD,*LPDWORD;https://msdn.microsoft.com/en-us/library/cc230318.aspx
来自微软的Uint32定义
类型定义函数unsigned int UINT32;https://msdn.microsoft.com/en-us/library/cc230386.aspx
现在你可以看到区别了.一个是unsigned long,另一个是unsigned int
https://stackoverflow.com/questions/39951473
复制