2017-03-08 3 views
2

Je suis en train de faire un petit programme, où je peux taper une adresse IPv4 et une adresse SubMask.Chaîne binaire à int puis un BitWise ET

fonctionne très bien ...

Ensuite, je vais faire un ET, donc je peux voir ce que l'adresse IPv4 SubNetwork est de, en (binaire) ... et je ne peux pas le faire fonctionner , quelqu'un peut-il aider ..

ici im essayant de convertir la chaîne de bits à un Int, donc je peux faire et AND, mais mes variabels iSIDs et iSIDr (type int) DonT obtenir une valeur ..

le variabels subrésult et result sont des adresses de conversion IPv4 décimales en 32 binaires donc des chaînes BitWise ...

 string SIDsubresult = subresult; 
     SIDsubresult = SIDsubresult.Replace(".", ""); 
     string SIDresult = result; 
     SIDresult = SIDresult.Replace(".", ""); 
     int iSIDs = Convert.ToInt32(SIDsubresult); 
     int iSIDr = Convert.ToInt32(SIDresult); 
     Console.Write(iSIDr & iSIDs); 

EDIT/UPDATE

Juste pour que tous le code avant le code que je commencé à écrire .. Mon code avant alors et le code est ici

 var split = (from p in ipv4add.Split('.') select int.Parse(p)).ToArray(); 
     string result = string.Format("{0}.{1}.{2}.{3}", 
      Convert.ToString(split[0], 2).PadLeft(8, '0'), 
      Convert.ToString(split[1], 2).PadLeft(8, '0'), 
      Convert.ToString(split[2], 2).PadLeft(8, '0'), 
      Convert.ToString(split[3], 2).PadLeft(8, '0')); 

     var subsplit = (from s in subnetmaske.Split('.') select int.Parse(s)).ToArray(); 
     string subresult = string.Format("{0}.{1}.{2}.{3}", 
      Convert.ToString(subsplit[0], 2).PadLeft(8, '0'), 
      Convert.ToString(subsplit[1], 2).PadLeft(8, '0'), 
      Convert.ToString(subsplit[2], 2).PadLeft(8, '0'), 
      Convert.ToString(subsplit[3], 2).PadLeft(8, '0')); 

     string SIDsubresult = subresult; 
     SIDsubresult = SIDsubresult.Replace(".", ""); 
     string SIDresult = result; 
     SIDresult = SIDresult.Replace(".", ""); 
     int iSIDs = Convert.ToInt32(SIDsubresult); 
     int iSIDr = Convert.ToInt32(SIDresult); 
     Console.Write(iSIDr & iSIDs); 
+2

Conversion d'une adresse IPv4 int en analysant sans périodes est très mal et déborde généralement – harold

+0

Voir par exemple ici http://stackoverflow.com/questions/1499269/how-to-check-if- adresse-ip-est-dans-un-sous-réseau particulier sur la façon de vérifier une adresse IP pour un sous-réseau – xanatos

+0

Utilisez uint au lieu de int. Les valeurs maximales d'IPV4 peuvent être 0xFFFFFFFF, ce qui débordera un int, mais pas uint. – jdweng

Répondre

0

son int max car ont 9 numéros longueur et ajouter votre ip est plus Essayez travailler avec longue:

string SIDsubresult = subresult; 
    SIDsubresult = SIDsubresult.Replace(".", ""); 
    string SIDresult = result; 
    SIDresult = SIDresult.Replace(".", ""); 
    long iSIDs = Convert.ToInt64(SIDsubresult); 
    long iSIDr = Convert.ToInt64(SIDresult); 
    Console.Write(iSIDr & iSIDs); 
+1

Encore vraiment faux, le débordement n'est pas le problème principal, mais par ex. "1.1.1.1" doit analyser 0x01010101 pour ne pas (décimal) 1111 (aka 0x457 qui ressemble juste à de la merde au hasard parce que c'est). – harold

0

J'ai essayé et travailler pour moi:

var sidsub = SIDsubresult.Split('.'); 
     var sid = SIDresult.Split('.'); 

     var result = ""; 
     for (int i = 0; i < sidsub.Length; i++) 
     { 
      result += (int.Parse(sidsub[i]) & int.Parse(sid[i])); 
      if (i + 1 != sidsub.Length) result += "."; 
     }