2017-03-08 85 views
2

我想制作一个小程序,在那里我可以键入一个IPv4地址和一个SubMask地址。二进制字符串int和然后BitWise AND

做工精细...

然后我会作出AND,这样我就可以看到子网的IPv4地址是在(二进制形式)... ,我不能让它开始工作,有人可以帮助..

这里我尝试按位字符串转换成int,这样我就可以做出和AND,但我variabels iSIDs和iSIDr(int数据类型)不得到的值..

的variabels子结果和结果是32位二进制形式的十进制IPv4转换地址,所以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); 

编辑/ UPDATE

只是让所有有我开始写代码.. 我的代码之前的代码之前就和代码是在这里

 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

转换的IPv4地址解析它没有时间为int是非常错误的,通常溢出 – harold

+0

例如,见这里http://stackoverflow.com/questions/1499269/how-to-check-if- an-ip-address-is-within-a-particular-subnet关于如何检查子网的IP – xanatos

+0

使用uint而不是int。 IPV4的最大值可以是0xFFFFFFFF,这会溢出一个int,但不是uint。 – jdweng

回答

0

其因为INT最多有9个号码长度和你的IP ADD是不再与长 尝试的工作:

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

尽管如此,溢出不是主要问题,但对于前。 “1.1.1.1”必须解析为0x01010101而不是(十进制)1111(又名0x457,因为它看起来像随机废话)。 – harold

0

我尝试这样做,工作我:

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 += "."; 
     } 
相关问题