日期:2014-05-17  浏览次数:20855 次

将IP转换成长整型的原理是什么?
我得到一个根据IP地址,确定地理位置的源码,里面有?一个方法?是将IP转换成长整型?算法中涉及到了?位移操作,不太理解为什么?这样做?即??Ipv?+=?Ipi?<<?(3?-?i)?*?8;?这句话?不太理解?代码如下:


????????//?IP字符串->长整型值
????????public?static?uint?IpStringToInt(string?IpString)
????????{
????????????uint?Ipv?=?0;
????????????string[]?IpStringArray?=?IpString.Split('.');
????????????int?i;
????????????uint?Ipi;
????????????for?(i?=?0;?i?<?4?&&?i?<?IpStringArray.Length;?i++)
????????????{
????????????????if?(IsNumeric(IpStringArray[i]))
????????????????{
????????????????????Ipi?=?(uint)Math.Abs(Convert.ToInt32(IpStringArray[i]));
????????????????????if?(Ipi?>?255)?Ipi?=?255;
????????????????????Ipv?+=?Ipi?<<?(3?-?i)?*?8;
????????????????}
????????????}
????????????return?Ipv;
????????}
?
????????//?字符串数值型判断
????????public?static?bool?IsNumeric(string?s)
????????{
????????????if?(s?!=?null?&&?System.Text.RegularExpressions.Regex.IsMatch(s,?@"^-?\d+$"))
????????????????return?true;
????????????else
????????????????return?false;
????????}

------解决方案--------------------
引用:
            for (i = 0; i < 4 && i < IpStringArray.Length; i++)
            {
                if (IsNumeric(IpStringArray[i]))
                {
                    Ipi = (uint)Math.Abs(Convert.ToInt32(IpStringArray[i]));
                    if (Ipi > 255) Ipi = 255;
                    Ipv += Ipi << (3 - i) * 8;
                }
            }

这简单的几句话其“一目了然的bug”也是多的令人发指。例如
     1bd.172.1.8a
     192.168.1.256
     -1.168.1.200
诸如此类的都是ip?

唉!
------解决方案--------------------
在10进制计算中,移位表示x10和/10。比如
30右移1位,3,就是/10
30左移1位,300,就是x10。
(这个小学生都会吧)。

那么二进制一个道理,左移就是x2,左移n位就是x2^n,右移就是/2。

给你一个思考题:十六进制 0x3A 是 0x3A0 的多少倍?不要化为10进制脱口说出来。