0

所以我有一些常数:

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

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

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

对于 Windows 2000,这看起来像"500". 它“匹配” ushort,只是没有0x0.

我想做的是移交version给一个函数,因为ushort它返回正确的操作系统:

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,所以它永远不会找到操作系统并返回Unknown OS version,而是。当我调试并悬停在 上时_WIN32_WINNT_WIN2K,它实际上1280是十进制格式。 _WIN32_WINNT_NT4显示为1024,因此"400"永远不会匹配它。

如果我包括“0x0”:

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

它给了我一个错误,即输入格式不正确。

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

4

2 回答 2

1

您已经有了常量,它们是十六进制的。如果您正在获取400并且500它们也是十六进制,请替换:

ushort uniNum = Convert.ToUInt16(version);

和:

ushort uniNum = Convert.ToUInt16(version, 16);
于 2017-10-19T01:42:16.640 回答
0

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

const ushort _WIN32_WINNT_NT4 = 0x0400;

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

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

const ushort _WIN32_WINNT_NT4 = 400;
于 2017-10-19T01:06:53.737 回答