2017-10-19 2 views
0

J'ai donc quelques constantes:Concaténer, convertir en USHORT, comparer contre ushort

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

Et puis j'ai un numéro de version, le numéro de version mineure, et le numéro de service pack, que, lorsque vous concaténer les ensemble, c'est le même que le nombre ci-dessus - sauf 2 d'entre eux sont int et l'un est un string. Je peux les obtenir tous dans une chaîne comme ceci:

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

Pour Windows 2000, cela ressemblerait "500". Il "correspond" à l'ushort, juste sans le 0x0.

Ce que je voudrais faire est la main de version à une fonction, en tant que ushort qui retourne le système d'exploitation correct:

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."; 
    } 
} 

Le problème est, même si je fais:

ushort uniNum = Convert.ToUInt16(version); 

Et dites qu'il l'envoie en tant que 500, la constante est 0x0500, donc il ne trouve jamais le système d'exploitation et renvoie Unknown OS version, à la place. Lorsque je débogue et passe la souris sur _WIN32_WINNT_WIN2K, il s'agit en fait de 1280 au format décimal. _WIN32_WINNT_NT4 est affiché comme 1024, donc "400" ne le correspondrait jamais.

Et si j'inclure le "0x0":

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

Il me donne une erreur que l'entrée est au format incorrect.

Il me manque probablement quelque chose de simple, mais je ne trouve rien qui ait été utile.

Répondre

1

Vous avez déjà les constantes et ils sont en hexa . Si vous obtenez 400 et 500 ils sont aussi hexadécimal, remplacez donc:

ushort uniNum = Convert.ToUInt16(version); 

avec:

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

Oui, exactement ce dont j'avais besoin. Merci un million! – vapcguy

0

Votre déclaration de valeur constante est une expression littérale hexadécimale:

const ushort _WIN32_WINNT_NT4 = 0x0400; 

0x0400 est équivalent à hex 400, décimal 1024. Donc, fondamentalement, vous n'êtes pas à comparer à 400 mais à 1024.

Changez votre constante à 400 si vous souhaitez comparer contre 400:

const ushort _WIN32_WINNT_NT4 = 400; 
+0

Désolé, mais je ne pense pas que ce soit possible 1) alors il est pas un 'ushort 'plus - pourrait aussi bien les appeler tous' int', 2) Je n'ai pas de contrôle sur ce qui revient de la fonction de Microsoft quant à la façon dont elle se définit. – vapcguy

+0

En outre, s'il était hexadécimal 400, la décimale serait 190, pas 1024. Je ne sais pas comment Visual Studio obtient 1024 pour '0x0400'. – vapcguy