Zum Hauptinhalt springen
claw
am
tools
Werkzeuge
Dokumente
Daoark
EN
Startseite
Startseite
/
Netzwerkwerkzeuge
›
/g,'>'); } function pad(n, w) { var s = String(n); while (s.length < w) s = '0' + s; return s; } function ipToInt(ip) { var p = ip.split('.'); if (p.length !== 4) throw new Error('IP 格式错误,需 4 段'); for (var i = 0; i < 4; i++) { var n = parseInt(p[i], 10); if (isNaN(n) || n < 0 || n > 255) throw new Error('IP 段越界 (0-255)'); p[i] = n; } return ((p[0]<<24)>>>0) + (p[1]<<16) + (p[2]<<8) + p[3]; } function intToIp(n) { return ((n>>>24) & 255) + '.' + ((n>>>16) & 255) + '.' + ((n>>>8) & 255) + '.' + (n & 255); } function intToBin(n) { return pad((n>>>24)&255, 8) + '.' + pad((n>>>16)&255, 8) + '.' + pad((n>>>8)&255, 8) + '.' + pad(n&255, 8); } function maskFromCidr(c) { return c === 0 ? 0 : (0xFFFFFFFF << (32 - c)) >>> 0; } function maskToCidr(m) { if (m === 0) return 0; var c = 0; var n = m; while ((n & 0x80000000) !== 0) { c++; n = (n << 1) >>> 0; } return c; } function ipClass(ipInt) { var o1 = (ipInt >>> 24) & 255; if (o1 < 128) return 'A 类'; if (o1 < 192) return 'B 类'; if (o1 < 224) return 'C 类'; if (o1 < 240) return 'D 类 (组播)'; return 'E 类 (实验)'; } function ipClassNetSize(cls) { if (cls === 'A 类') return 8; if (cls === 'B 类') return 16; if (cls === 'C 类') return 24; return 0; } function ipType(ipInt, maskInt) { var network = (ipInt & maskInt) >>> 0; var c = maskToCidr(maskInt); var o1 = (ipInt >>> 24) & 255; if (o1 === 10) return '私有 (RFC1918)'; if (o1 === 172 && ((ipInt>>>16)&255) >= 16 && ((ipInt>>>16)&255) <= 31) return '私有 (RFC1918)'; if (o1 === 192 && ((ipInt>>>16)&255) === 168) return '私有 (RFC1918)'; if (o1 === 127) return '环回 (Loopback)'; if (o1 === 169 && ((ipInt>>>16)&255) === 254) return '链路本地 (APIPA)'; if (c >= 24 && (network === 0 || (ipInt & ~maskInt) === 0)) return '零/全网地址'; return '公网'; } function hostBitsNeeded(hosts) { var bits = 0; while ((Math.pow(2, bits) - 2) < hosts) bits++; return bits; } document.getElementById('f').addEventListener('submit', function(e) { e.preventDefault(); errorMsg.textContent = ''; try { var ipStr = document.getElementById('ip').value.trim(); var cidr = parseInt(document.getElementById('cidr').value, 10); if (isNaN(cidr) || cidr < 0 || cidr > 32) throw new Error('CIDR 需 0-32'); var mode = document.querySelector('input[name="mode"]:checked').value; var ipInt = ipToInt(ipStr); var maskInt = maskFromCidr(cidr); var network = (ipInt & maskInt) >>> 0; var wildcard = (~maskInt) >>> 0; var broadcast = (network | wildcard) >>> 0; var totalIps = Math.pow(2, 32 - cidr); var usableIps = totalIps >= 2 ? totalIps - 2 : 0; var firstHost = cidr >= 31 ? network : (network + 1) >>> 0; var lastHost = cidr >= 31 ? broadcast : (broadcast - 1) >>> 0; var cls = ipClass(ipInt); var netCidr = ipClassNetSize(cls); var html = ''; html += '
'; html += '
' + escape(ipStr) + ' / ' + cidr + '
'; html += '
' + cls + ' · ' + ipType(ipInt, maskInt) + '
'; html += '
'; html += '
'; html += '
输入 IP
' + escape(ipStr) + '
'; html += '
CIDR
/' + cidr + ' (' + intToIp(maskInt) + ')
'; html += '
子网掩码 (二进制)
' + intToBin(maskInt) + '
'; html += '
反掩码 (Wildcard)
' + intToIp(wildcard) + '
'; html += '
IP 二进制
' + intToBin(ipInt) + '
'; html += '
网络地址
' + intToIp(network) + '
'; html += '
广播地址
' + intToIp(broadcast) + '
'; html += '
可用 IP 范围
' + intToIp(firstHost) + ' - ' + intToIp(lastHost) + '
'; html += '
总 IP 数
' + totalIps.toLocaleString() + '
'; html += '
可用 IP 数
' + usableIps.toLocaleString() + (cidr >= 31 ? ' (/31 或 /32 不减 2)' : '') + '
'; html += '
IP 类
' + cls + (netCidr ? ' (默认掩码 /' + netCidr + ')' : '') + '
'; html += '
主机位数
' + (32 - cidr) + ' 位
'; html += '
'; if (mode === 'vlsm') { var sizes = Array.from(document.querySelectorAll('.vlsm-size')).map(function(x){ return parseInt(x.value, 10); }); for (var i = 0; i < sizes.length; i++) { if (isNaN(sizes[i]) || sizes[i] < 1) throw new Error('子网 ' + (i+1) + ' 主机数无效'); } sizes.sort(function(a,b){ return b-a; }); html += '
VLSM 划分结果 (从大到小排序)
'; html += '
#
子网名称
需求主机
子网掩码
网络地址
广播地址
可用范围
浪费主机
'; var cursor = network; var remaining = (broadcast - network + 1) >>> 0; for (var j = 0; j < sizes.length; j++) { if (remaining < sizes[j] + 2) { html += '
子网 ' + (j+1) + ' 剩余地址不足
'; break; } var need = sizes[j]; var hb = hostBitsNeeded(need); var subCidr = 32 - hb; var subMask = maskFromCidr(subCidr); var subNet = cursor; var subBroadcast = (subNet | ((~subMask)>>>0)) >>> 0; var subFirst = (subNet + 1) >>> 0; var subLast = (subBroadcast - 1) >>> 0; var subTotal = (subBroadcast - subNet + 1) >>> 0; var waste = subTotal - need - 2; html += '
'; html += '
' + (j+1) + '
'; html += '
Subnet-' + (j+1) + '
'; html += '
' + need + '
'; html += '
/' + subCidr + ' (' + intToIp(subMask) + ')
'; html += '
' + intToIp(subNet) + '
'; html += '
' + intToIp(subBroadcast) + '
'; html += '
' + intToIp(subFirst) + ' - ' + intToIp(subLast) + '
'; html += '
' + waste + '
'; html += '
'; cursor = (subBroadcast + 1) >>> 0; remaining = (broadcast - cursor + 1) >>> 0; } html += '
'; } resultMeta.textContent = 'IP: ' + ipStr + ' / ' + cidr + ' · ' + cls + ' · 总 ' + totalIps.toLocaleString() + ' IP'; resultContent.innerHTML = html; resultArea.classList.add('show'); } catch (err) { errorMsg.textContent = '错误: ' + err.message; resultArea.classList.remove('show'); } }); })();