2016-12-08 2 views
0

범위의 총 ips 수를 계산할 방법을 찾고 있습니다. 예 : 1.1.1.1과 5.5.5.5 사이에는 총 65022 개의 ips가 있습니다.수학 : 범위의 전체 IPS 계산

int Remain = 
    (IP2[0] - IP1[0]) * 256 + 
    (IP2[1] - IP1[1]) * 256 + 
    (IP2[2] - IP1[2]) * 256 + 
    (IP2[3] - IP1[3]) + 1; 

그것은 C 클래스까지 낮은 범위에 대해서만 작동합니다 는 지금은이 코드가 있습니다. a 및 b 클래스의 경우 잘못된 결과가 나타납니다. 숫자가 너무 커서 int를 유지할 수 없기 때문에 생각합니다. 누구나 올바른 알고리즘을 계산할 수 있습니까?

+0

'int'는 * signed *이고 그 정수 리터럴 ('256'과 같은)은 지정자로 접미사가 붙지 않는 한'int' 타입이라는 것을 기억하십시오. –

+0

인터넷은 오늘날 클래스없는 도메인 간 라우팅을 기반으로한다고 생각했습니다. – Amadeus

답변

1

예를 들어 클래스 C (최대 2^31 조합)까지 가능한 경우 서명 된 int가 문제가 될 것이라고 추측합니다 (물론 int 시스템에서 32 비트입니다.)

그러나 부호없는 정수를 사용하여 전환 할 수 있으면 충분히 처리 할 수 ​​있습니다. 그러나, 분명히 다른 클래스들은 (http://www.vlsm-calc.net/ipclasses.php) 적용될 필요가있는 마스킹을 가지고 있으므로 idk를 고려해야한다.

: 모든 IPv4의 IP를 이후 또한

는 당신이 필요하면 구현하기 쉽게 마스킹 전화가 정말 사용하지만 만들 것, 나는이를 계산하는 또 다른 신속하고 더러운 방법을 제공, 단 4 바이트의 번호입니다
unsigned int calculate_available_ips(int r_start[4], int r_end[4]) 
{ 
    unsigned int ip1 = r_start[0] << 24 | r_start[1] << 16 | r_start[2] << 8 | r_start[3]; 
    unsigned int ip2 = r_end[0] << 24 | r_end[1] << 16 | r_end[2] << 8 | r_end[3]; 

    if (ip1 > ip2) { 
     return ip1 - ip2 + 1; 
    } 
    return ip2 - ip1 + 1; 
} 

자연스럽게 마스킹은 uint의 비트 연산을 사용하여 수행됩니다. 참고로 부호없는 값을 인쇄하려면 %d 대신 %u을 사용하십시오.

+0

이것은 완벽하게 작동합니다. 나는 이것을 미래의 프로젝트에 사용할 것이다! 인쇄하려면 – Clarke

+0

이'% u '이어야합니다. 감사합니다. –