84 lines
3.1 KiB
Text
84 lines
3.1 KiB
Text
|
|
[
|
||
|
|
// IP Subnet and Broadcast Calculator
|
||
|
|
{
|
||
|
|
"name": "IP Subnet and Broadcast",
|
||
|
|
"description": r"""
|
||
|
|
Calculates the network (subnet) address and broadcast address for an IPv4 address with CIDR notation.
|
||
|
|
|
||
|
|
**Input format:** `ip_address/prefix` where:
|
||
|
|
- `ip_address`: IPv4 address in dotted decimal notation (e.g., `192.168.1.100`)
|
||
|
|
- `prefix`: CIDR prefix length (1-30) or subnet mask in dotted notation (e.g., `24` or `255.255.255.0`)
|
||
|
|
|
||
|
|
**Output:**
|
||
|
|
- `subnet`: Network address in dotted decimal notation
|
||
|
|
- `broadcast`: Broadcast address in dotted decimal notation
|
||
|
|
|
||
|
|
**Examples:**
|
||
|
|
- Input: `192.168.1.100/24` → Subnet: `192.168.1.0`, Broadcast: `192.168.1.255`
|
||
|
|
- Input: `10.0.0.50/8` → Subnet: `10.0.0.0`, Broadcast: `10.255.255.255`
|
||
|
|
- Input: `172.16.5.100/16` → Subnet: `172.16.0.0`, Broadcast: `172.16.255.255`""",
|
||
|
|
"input": [
|
||
|
|
{"name": "ipWithMask", "unit": "scalar"}
|
||
|
|
],
|
||
|
|
"output": {"name": "subnet", "unit": "scalar"},
|
||
|
|
"d4rtCode": """
|
||
|
|
var input = ipWithMask.toString();
|
||
|
|
var slashIndex = input.indexOf('/');
|
||
|
|
if (slashIndex == -1) {
|
||
|
|
subnet = 'error: no / found';
|
||
|
|
broadcast = '';
|
||
|
|
} else {
|
||
|
|
var ipPart = input.substring(0, slashIndex).trim();
|
||
|
|
var maskPart = input.substring(slashIndex + 1).trim();
|
||
|
|
|
||
|
|
// Parse IP address
|
||
|
|
var ipParts = ipPart.split('.');
|
||
|
|
if (ipParts.length != 4) {
|
||
|
|
subnet = 'error: invalid IP';
|
||
|
|
broadcast = '';
|
||
|
|
} else {
|
||
|
|
var octet1 = int.parse(ipParts[0]);
|
||
|
|
var octet2 = int.parse(ipParts[1]);
|
||
|
|
var octet3 = int.parse(ipParts[2]);
|
||
|
|
var octet4 = int.parse(ipParts[3]);
|
||
|
|
|
||
|
|
// Convert IP to 32-bit integer
|
||
|
|
var ipInt = (octet1 << 24) | (octet2 << 16) | (octet3 << 8) | octet4;
|
||
|
|
|
||
|
|
// Parse mask (CIDR prefix or dotted notation)
|
||
|
|
int maskInt;
|
||
|
|
if (maskPart.contains('.')) {
|
||
|
|
var maskParts = maskPart.split('.');
|
||
|
|
var m1 = int.parse(maskParts[0]);
|
||
|
|
var m2 = int.parse(maskParts[1]);
|
||
|
|
var m3 = int.parse(maskParts[2]);
|
||
|
|
var m4 = int.parse(maskParts[3]);
|
||
|
|
maskInt = (m1 << 24) | (m2 << 16) | (m3 << 8) | m4;
|
||
|
|
} else {
|
||
|
|
var prefix = int.parse(maskPart);
|
||
|
|
maskInt = prefix == 0 ? 0 : (-1 << (32 - prefix));
|
||
|
|
}
|
||
|
|
|
||
|
|
// Calculate subnet and broadcast
|
||
|
|
var subnetInt = ipInt & maskInt;
|
||
|
|
var broadcastInt = subnetInt | (~maskInt & 0xFFFFFFFF);
|
||
|
|
|
||
|
|
// Convert back to dotted notation
|
||
|
|
var s1 = (subnetInt >> 24) & 0xFF;
|
||
|
|
var s2 = (subnetInt >> 16) & 0xFF;
|
||
|
|
var s3 = (subnetInt >> 8) & 0xFF;
|
||
|
|
var s4 = subnetInt & 0xFF;
|
||
|
|
subnet = '\$s1.\$s2.\$s3.\$s4';
|
||
|
|
|
||
|
|
var b1 = (broadcastInt >> 24) & 0xFF;
|
||
|
|
var b2 = (broadcastInt >> 16) & 0xFF;
|
||
|
|
var b3 = (broadcastInt >> 8) & 0xFF;
|
||
|
|
var b4 = broadcastInt & 0xFF;
|
||
|
|
broadcast = '\$b1.\$b2.\$b3.\$b4';
|
||
|
|
}
|
||
|
|
}
|
||
|
|
""",
|
||
|
|
"tags": ["networking", "ip", "subnet", "broadcast", "cidr"]
|
||
|
|
}
|
||
|
|
]
|