繁体   English   中英

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

[英]Concatenate strings, convert to ushort, compare against ushort

所以我有一些常数:

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

然后我有一个主要版本号,次要版本号和Service Pack编号,当您将它们串联在一起时,它与上面的编号相同-除了它们中的2个是int且一个是string 我可以将它们全部放入这样的字符串中:

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

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

我想做的是将version切换到函数,作为返回正确OS的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 ,而是返回Unknown OS version 当我调试并悬停在_WIN32_WINNT_WIN2K ,实际上是1280 (十进制格式)。 _WIN32_WINNT_NT4显示为1024 ,因此"400"将永远不匹配。

如果我包含“ 0x0”:

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

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

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

您已经有了常量,并且它们是十六进制的。 如果您得到400500它们也都是十六进制的,因此请替换:

ushort uniNum = Convert.ToUInt16(version);

有:

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

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

const ushort _WIN32_WINNT_NT4 = 0x0400;

其中0x0400等于十六进制400 ,十进制1024 所以基本上,您所比较的不是400,而是1024。

如果要与400比较,请将常数更改为400:

const ushort _WIN32_WINNT_NT4 = 400;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM