有符号整数到无符号整数和 DWORD 转换

本文关键字:DWORD 转换 无符号整数 符号 整数 | 更新日期: 2023-09-27 18:34:28

>我有一个Win32 API调用,它返回一个有符号的32位整数值(-2147022987(。

Windows计算器(在程序员视图中Alt-3(模式设置为Dec,如果我输入-2147022987的值,然后将模式切换到Word,则Dword得到1909。 我是否正确理解 1909 年是DWord中包含的两个Word之一的代表?此值是低阶Dword还是高阶Dword

如何在 C# 中以编程方式进行此转换,以便将值与下面定义的枚举类型匹配?

public enum LogonError : ushort
{
    LogonSuccessful = 0,
    PasswordMustChange = 1907,
    NoSuchUser = 1317,
    LogonFailure = 1326,
    AccountRestriction = 1327,
    AccountDisabled = 1331,
    InvalidLogonHours = 1328,
    NoLogonServers = 1311,
    InvalidWorkstation = 1329,
    AccountLockedOut = 1909,
    AccountExpired = 1793,
    PasswordExpired = 1330
} 

有符号整数到无符号整数和 DWORD 转换

您可以使用&(按位 AND(运算符,如下所示:

int i = -2147022987;
LogonError err = (LogonError)(i & 0xffff);  // 1909

假设您像这样声明外部 API 调用:

[DllImport("advapi32.dll", SetLastError = true)]
static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);

您可以使用此函数获取错误代码:

int errorCode = Marshal.GetLastWin32Error();

您可能需要将枚举更改为 int,这仅在使用SetLastError = true时有效