2017-03-08 10 views
2

IPv4 주소와 서브 마스크 주소를 입력 할 수있는 작은 프로그램을 만들려고합니다.이진 문자열을 int로 변환 한 다음 BitWise AND

그럼 내가 AND 것, 그래서 IPv4 주소가 (바이너리 형식)에,에서 ... 이다 서브 무엇을 볼 수 있고 내가이 동작하지 않습니다 ... 좋은 작품 .. 누군가가 int로 비트 단위의 문자열을 변환하려고 여기 메신저 ..

을 도울 수있는, 그래서 내가 할 수 AND,하지만 내 variabels의 iSIDs 및 iSIDr (nt 데이터 형)의 값을 얻을 해달라고

variabels subresult 및 result는 32 진수 형식의 10 진 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); 

EDIT/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

이 기간없이 분석하여 int로 IPv4 주소를 변환하는 것은 매우 잘못된 것입니다 일반적으로 – harold

+0

여기 http://stackoverflow.com/questions/1499269/how-to-check-if- 예를 들어보기 오버 플로우 서브넷에 대한 IP를 확인하는 방법에 대한 -IP 주소가 특정 서브넷에 있음 – xanatos

+0

int 대신 uint를 사용하십시오. IPV4 최대 값은 0xFFFFFFFF가 될 수 있습니다.이 값은 int가 오버 플로우되지만 uint는 오버 플로우됩니다. – jdweng

답변

0

의 INT 최대 9 개 숫자를 가지고 있기 때문에 길이 나는이 작업을 시도

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 (11 진수)가 아닌 1111 (일명 0x457인데 이는 임의의 쓰레기처럼 보입니다)로 구문 분석해야합니다. – harold

0

: 당신의 IP 추가는 더 이상 긴와 시도의 작품입니다 나 :

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