签名整数到无符号整数& DWORD转换

时间:2014-12-17 21:39:32

标签: c#

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

在Windows计算器中(在程序员视图中Alt-3)模式设置为DecDword如果我输入值-2147022987然后将模式切换为Word我得到1909.我是否正确理解1909是Word中包含的两个DWord之一的表示?此值是低顺序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
} 

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

假设您正在声明外部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

时有效