百度空间 | 百度首页 
 
查看文章
 
IPv4 地址转换成相应的三十二位整型数
2008年12月19日 星期五 11:12

  今天无意中看到百度知道上有人问这个问题(C#怎么把IP转换成长整型??),结果一个错误的答案竟然被评为最佳……然后我继续找了一下,发现很多人都不会写代码,考虑得很不严谨。UMU 被迫把这个简单到几乎不能叫它“算法题”的问题在此发表一下。代码是 C# 写的。

  0. 第 5 行,TryParse 可以保证输入非法 IP 时程序不会异常,很多人没考虑这点,失败!

  1. 第 8 行,IPAddress.Address 已经被弃用,UMU 都把警告当成错误,所以不用它。但很多人无所谓,很失败!

  2. 第 10 行,很多人不检查 AddressFamily,如果传入的是 IPv6 地址,他们还继续 Address,失败中的失败!

  3. IP 地址使用的是网络字节序,也就是大尾字节序,应该转为主机字节序,x86 下是小尾字节序,这样方便做一些额外的加工。

  4. 如果您希望把整型数存入数据库,那应该直接用下列的代码,返回值类型是 Int32,因为有的数据库不支持 Unsigned,必须用更大长度的类型来存放,浪费了;如果您希望能进行 IP 大小比较,比如 128.0.0.0 > 127.0.0.2 > 127.0.0.1,则要把返回值改为 UInt32,否则 128.0.0.0 将变成负数,所以会 128.0.0.0 < 127.0.0.2。

附 JScript 代码:

function IPv4StringToInt32(strIP)
{
        var strArrayPart = strIP.split(".");
        var nCountOfPart = strArrayPart.length;

        if (nCountOfPart == 0 || nCountOfPart > 4)
        {
                return 0;
        }

        var nPart = new Array(0, 0, 0, 0);
        var i;

        for (i = 0; i < nCountOfPart - 1; ++i)
        {
                nPart[i] = parseInt(strArrayPart[i]);

                if (nPart[i] < 0 || nPart[i] > 255)
                {
                        return 0;
                }
        }

        nPart[3] = parseInt(strArrayPart[i]);
        if (nPart[3] < 0 || nPart[3] > 255)
        {
                return 0;
        }

        return nPart[0] << 24 | nPart[1] << 16 | nPart[2] << 8 | nPart[3];
}


类别:算法题 | 添加到搜藏 | 浏览() | 评论 (4)
 
最近读者:
 
网友评论:
1
2008年12月20日 星期六 16:24 | 回复
学习ing
 
2
2008年12月20日 星期六 22:07 | 回复
你好厉害。。
 
3
2008年12月27日 星期六 18:14 | 回复
nice
 
4
2009年02月11日 星期三 19:12 | 回复
good~
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu