吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2538|回复: 21
收起左侧

[Python 原创] IPV4 子网小工具

[复制链接]
三滑稽甲苯 发表于 2023-11-15 15:50

IPV4 子网小工具

🪄 说明

写计网作业的时候有很多题目要求在二进制子网掩码和点十进制表示法间相互转换。每次都手动转换太费力气了,而且还容易出错,于是我写了这个脚本方便自己。(还真找到几个自己手动转换出错的)

这个脚本可将二进制子网掩码转换为人类可读的表示法(点十进制表示法加长度),反之亦然。此外,它还可以同时提供给定子网中的可用 IP 范围和数量。

📖 使用方法

  • 保存脚本为 subnet_helper.py
  • python3 ./subnet_helper.py
  • 输入二进制子网掩码或人类可读的表示法
  • Enter 键获取结果
  • Ctrl+C 退出

🍻 效果展示

$ python3 ./subnet_helper.py
> 225.128.0/9
Prefix: 11100001 1
  Available IP count: 2^23 = 8388608
  Available IP range: 225.128.0.0 - 225.255.255.255
  Available IP range (bin): 11100001 10000000 00000000 00000000 - 11100001 11111111 11111111 11111111
> 11100000 00
Human-friendly: 224.0.0.0/10
  Available IP count: 2^22 = 4194304
  Available IP range: 224.0.0.0 - 224.63.255.255
  Available IP range (bin): 11100000 00000000 00000000 00000000 - 11100000 00111111 11111111 11111111
>

截图:

normal.jpg

如果你安装了 rich 模块,你可以得到彩色的输出:

rich.jpg

源码

GitHub 地址

try:
    from rich import print
except ImportError:
    RICH = False
else:
    RICH = True

def binToList(s: str) -> list[str]:
    # Convert 1110000001000000 to [224, 64, 0, 0]
    # Split into octets
    octets = [s[i:i+8] for i in range(0, len(s), 8)]
    # Pad with 0
    octets = [octet.ljust(8, "0") for octet in octets]
    # Convert to int
    l = [int(octet, 2) for octet in octets]
    if len(l) < 4:
        l += [0] * (4 - len(l))
    return l

def spacePad(s: str):
    # Add spaces every 8 characters
    return " ".join([s[i:i+8] for i in range(0, len(s), 8)])

def prefixToHuman(s: str) -> str:
    #  Convert 11100000 01000000 to 224.64.0.0/16
    # Remove spaces
    s = s.replace(" ", "")
    length = len(s)
    l = binToList(s)
    ipv4 = ".".join([str(i) for i in l])
    return f"{ipv4}/{length}"

def humanToPrefix(s: str) -> str:
    # Convert 224.64.0.0/16 to 11100000 01000000
    parts = s.split("/")
    length = int(parts[1])
    parts = parts[0].split(".")
    # Convert to binary
    l = [bin(int(part))[2:].zfill(8) for part in parts]
    if len(l) < 4: # Complete with 0
        l += ["0" * 8] * (4 - len(l))
    binary = " ".join(l)
    length_with_spaces = length + (length // 8)
    return binary[:length_with_spaces]

def prefixToRange(s: str):
    # From binary prefix to available IP range
    # Remove spaces
    s = s.replace(" ", "")
    length = len(s)
    left = 32 - length
    print(f"  Available IP count: 2^{left} = {2 ** left}")
    l = binToList(s)
    start = ".".join([str(i) for i in l])
    l = binToList(s + "1" * left)
    end = ".".join([str(i) for i in l])
    print(f"  Available IP range: {start} - {end}")
    print(f"  Available IP range (bin): {spacePad(s + '0' * left)} - {spacePad(s + '1' * left)}")

if __name__ == "__main__":
    while True:
        try:
            s = input("> ")
        except KeyboardInterrupt:
            break
        if "/" in s:
            prefix = humanToPrefix(s)
            print(f"[cyan]Prefix: {prefix}[/cyan]" if RICH else f"Prefix: {prefix}")
        else:
            prefix = s
            print(f"[cyan]Human-friendly: {prefixToHuman(prefix)}[/cyan]" if RICH else f"Human-friendly: {prefixToHuman(prefix)}")
        prefixToRange(prefix)
    exit(0)

免费评分

参与人数 4吾爱币 +10 热心值 +3 收起 理由
goblack + 1 能跑py的环境说不定也带ipcalc?当练习了Py吧
wushaominkk + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hisir + 1 + 1 热心回复!
woyucheng + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ImYoubaba 发表于 2023-11-15 16:38
谢谢分享
laustar 发表于 2023-11-15 16:48
momo2436 发表于 2023-11-15 17:36
lgdobo 发表于 2023-11-15 18:00
应该要做IP6的工具了  哈哈
头像被屏蔽
xy1560 发表于 2023-11-15 18:23
提示: 作者被禁止或删除 内容自动屏蔽
lengrusong 发表于 2023-11-15 19:17
感谢分享,学习了
头像被屏蔽
moruye 发表于 2023-11-15 21:07
提示: 作者被禁止或删除 内容自动屏蔽
ekobe1796 发表于 2023-11-15 21:21
感谢分享!
技术小星 发表于 2023-11-15 21:26
感谢分享!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 09:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表