2017-10-19 85 views
0

所以我有一些常量:連接字符串,轉換爲USHORT,比較反對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"。它「匹配」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); 

它給了我一個錯誤的輸入格式不正確。

我可能錯過了一些簡單的東西,但我找不到任何有用的東西。

回答

1

你已經擁有的常量,他們是十六進制。如果您收到400500他們也是十六進制的,所以更換:

ushort uniNum = Convert.ToUInt16(version); 

有:

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

是的,正是我所需要的。太感謝了! – vapcguy

0

你的常量聲明的值是一個十六進制文字表達式:

const ushort _WIN32_WINNT_NT4 = 0x0400; 

哪裏0x0400相當於十六進制400,小數1024。因此,基本上,你不比較400,但到1024

更改常數爲400,如果你想進行比較的400:

const ushort _WIN32_WINNT_NT4 = 400; 
+0

很抱歉,但我不認爲這是可能的,1),那麼這不是一個'USHORT '不再 - 也可以稱它們爲全'int',2)我無法控制微軟函數返回的內容是如何定義它自己的。 – vapcguy

+0

此外,如果它是十六進制400,小數將是190,而不是1024.我不知道Visual Studio如何獲得1024'0x0400'。 – vapcguy