んと。普通にIPv4を知っている人だと、「IPアドレスでしょ unsigned longでしょとりあえず数値にしてから比較すると範囲とか扱いやすいよね」って考えるのは割と真っ当な発想だと思うです。
でまぁ、以前に
- まず.で区切って
- 作業用変数を8ビットシフトしてから足し込んで * 4回
ってやれば無問題、とか思ってたのですが色々と大間違い orz
実際にやってみてくださいいきなりint値が途中でfloatになったりしますから orz
その辺の悲劇は http://d.hatena.ne.jp/gallu/20060428/p1 あたりをご覧ください。
んで。
まぁ偶然なのですが。ip2longという素晴らしい関数を見つけました。
ぬぁんと。singned longで整数値ぷちこえるような値を渡してもfloatになりません!!
………代わりにマイナスになるんですがね orz
比較としては、えげつない手段が無いわけでもなくて。
マイナスになった値を、一度sprintfで%uつかって「文字列としてのunsignedな整数値と等しい数字文字列にした上で」比較すると、普通に比較出来たりします。…いやまぁ「文字列と数値の比較って重いんだろうなぁ」とか色々考えちゃうわけなのですが。
なんだか、使っていいのか悪いのかよぉ解らんTipsなのですが。
IPアドレスの比較でお困りの方がいらっしゃいましたら「最終手段のやむを得ない手の一つとして」隠し持っておくのも、或いは、あり、なのかも、しれません。あるいは。…本当に?
まぁ。GMP関数が使えない環境なら一考の余地あり、かなぁ………多分。