2016-12-08 13 views
0

範囲内のipsの総数を計算する方法を探しています。 たとえば、1.1.1.1と5.5.5.5の間に合計65022ipsがあります。 は、今私はこのコードを持っている:数学:範囲内の合計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はあなたの問題です

しかし、unsigned intを使用するように切り替えるには、これを十分に処理できるはずです。しかし、異なるクラスにはマスキングが適用されていることが明らかです(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'で印刷する必要があります。この感謝を反映するように今変更! –