查看文章 |
今天无意中看到百度知道上有人问这个问题(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) if (nCountOfPart == 0 || nCountOfPart > 4) var nPart = new Array(0, 0, 0, 0); for (i = 0; i < nCountOfPart - 1; ++i) if (nPart[i] < 0 || nPart[i] > 255) nPart[3] = parseInt(strArrayPart[i]); return nPart[0] << 24 | nPart[1] << 16 | nPart[2] << 8 | nPart[3]; |
