连接字符串,转换为 ushort,与 ushort 进行比较

Concatenate strings, convert to ushort, compare against ushort

所以我有一些常数:

const ushort _WIN32_WINNT_NT4 = 0x0400;
const ushort _WIN32_WINNT_WIN2K = 0x0500;
....

然后我有一个主要版本号、次要版本号和服务包号,当您将它们连接在一起时,它与上面的数字相同 - 除了其中 2 个是 int 和一个是 string。我可以将它们全部放入这样的字符串中:

string version = majorVersion.ToString() + minorVersion.ToString() + sp;

对于 Windows 2000,这看起来像 "500"。它 "matches" 是 ushort,只是没有 0x0.

我想做的是将 version 交给一个函数,作为 ushort returns 正确的 OS:

private static string WindowsVersion(ushort uniNum)
{
    switch (uniNum)
    {
        case _WIN32_WINNT_NT4:
            return "Windows NT 4.0";
        case _WIN32_WINNT_WIN2K:
            return "Windows 2000";
        ....
        default:
            return "Unknown OS version.";
    }
 }

问题是,即使我这样做了:

ushort uniNum = Convert.ToUInt16(version);

并说它以 500 形式发送,常量是 0x0500,所以它永远找不到 OS 和 returns Unknown OS version,而是.当我调试并将鼠标悬停在 _WIN32_WINNT_WIN2K 上时,它实际上是十进制格式的 1280_WIN32_WINNT_NT4 显示为 1024,因此 "400" 永远不会匹配它。

如果我包含“0x0”:

ushort uniNum = Convert.ToUInt16("0x0" + version);

提示输入格式不正确。

我可能遗漏了一些简单的东西,但我找不到任何有用的东西。

您的常量声明的值是一个十六进制文字表达式:

const ushort _WIN32_WINNT_NT4 = 0x0400;

其中0x0400相当于十六进制400、十进制1024。所以基本上,您不是与 400 进行比较,而是与 1024 进行比较。

如果您想与 400 进行比较,请将常量更改为 400:

const ushort _WIN32_WINNT_NT4 = 400;

您已经有了常量,它们是十六进制的。如果你得到 400500 它们也是十六进制的,所以替换:

ushort uniNum = Convert.ToUInt16(version);

与:

ushort uniNum = Convert.ToUInt16(version, 16);