Skip to content

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<<0192
aNum[1]168<<8168×256 = 43008
aNum[2]1<<161×65536 = 65536
aNum[3]1<<241×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 == "":返回 0
  • aNum.length != 4(非 IPv4):返回 0

相关文档 ​

基于 VitePress 构建 · 教学用途