2017-03-08 87 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 += "."; 
     } 
相關問題