ipToNumber() IP 转换
🔢 把点分十进制 IPv4 字符串转成 uint32。
📎 源码在线查看:
script.js#L194-L218(ipToNumber)
签名
javascript
function ipToNumber(ip)
// "192.168.1.1" -> 16885952 (小端拼接, >>>0 无符号)实现
javascript
function ipToNumber(ip) {
var num = 0;
if (ip == "") {
return num;
}
var aNum = ip.split(".");
if (aNum.length != 4) {
return num;
}
num += parseInt(aNum[0]) << 0;
num += parseInt(aNum[1]) << 8;
num += parseInt(aNum[2]) << 16;
num += parseInt(aNum[3]) << 24;
num = num >>> 0; // 关键: 保证无符号
return num;
}位运算拆解
以 192.168.1.1 为例:
| 段 | 值 | 位移 | 结果 |
|---|---|---|---|
| aNum[0] | 192 | <<0 | 192 |
| aNum[1] | 168 | <<8 | 168×256 = 43008 |
| aNum[2] | 1 | <<16 | 1×65536 = 65536 |
| aNum[3] | 1 | <<24 | 1×16777216 = 16777216 |
| 合计 | 16885952 |
为什么是小端拼接
这里用小端拼接是因为后面 ntohl() 会做字节序翻转,最终得到的是大端 uint32(网络序),Python 端再用 struct.pack(">I", ...) + inet_ntop 还原回可读 IP。
>>> 0 的关键作用
javascript
num = num >>> 0; //这个很关键,不然可能会出现负数的情况JS 的位运算把操作数当 32 位有符号整数。当最高位为 1(即 IP 首段 ≥ 128,如 192.x.x.x、200.x.x.x)时,<<24 会产生负数。>>> 0(无符号右移 0 位)把它转回无符号 uint32。
不加 >>> 0 的后果
192.168.1.1 的 <<24 部分会是负数,整个 num 变成负值,传到 Python 端 struct.pack(">I", 负数) 会报 argument out of range。
异常输入处理
ip == "":返回 0aNum.length != 4(非 IPv4):返回 0