V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
edis0n0
V2EX  ›  宽带症候群

如何找出哪些地址同时不在 128.0.0.0/1, 64.0.0.0/2, 32.0.0.0/3, 16.0.0.0/4, 0.0.0.0/5, 12.0.0.0/6, 8.0.0.0/7, 11.0.0.0/8 子网中的任意一个中?

  •  
  •   edis0n0 · 2023-01-20 21:14:16 +08:00 · 2353 次点击
    这是一个创建于 706 天前的主题,其中的信息可能已经有所发展或是发生改变。
    google 了很久也找不到计算方法
    17 条回复    2023-01-28 13:49:14 +08:00
    elfive
        1
    elfive  
       2023-01-20 21:24:52 +08:00 via iPhone
    按位对比就行了呀……
    如果 ( IP & Mask ) == (上面列表的 IP & 对应的 Mask )就说明在里面
    edis0n0
        2
    edis0n0  
    OP
       2023-01-20 21:27:33 +08:00
    @elfive 这样一轮下来似乎只能判断一个地址,有没有快速的计算方法?
    dzdh
        3
    dzdh  
       2023-01-20 21:28:12 +08:00
    ipv4 地址一共 4,294,967,296 个。你是要同时不满足 cidr 范围的所有 ipv4 地址的一个完整列表么?
    edis0n0
        4
    edis0n0  
    OP
       2023-01-20 21:31:35 +08:00
    @dzdh
    leonshaw
        5
    leonshaw  
       2023-01-20 21:52:49 +08:00
    区间拆分就行了
    eason1874
        6
    eason1874  
       2023-01-20 21:58:57 +08:00   ❤️ 1
    取相反范围的话,我会简单粗暴的,先合并 cidr ,然后转十进制排除掉,就像从 1-9 排除掉 3-5 得到 1-2 和 6-9
    eason1874
        7
    eason1874  
       2023-01-20 22:00:37 +08:00
    #6 说转十进制不太对,应该叫转 long ip
    edis0n0
        8
    edis0n0  
    OP
       2023-01-20 22:03:57 +08:00
    @eason1874 这些 cidr 好像合并不了
    eason1874
        9
    eason1874  
       2023-01-20 22:11:34 +08:00
    @edis0n0 那就直接转呗
    xupefei
        10
    xupefei  
       2023-01-20 22:11:53 +08:00 via iPhone
    @eason1874 说的对,把开始和结束 ip 转成 int 或 long ,排序后从全局空间里逐个排除。
    tril
        11
    tril  
       2023-01-20 22:44:51 +08:00   ❤️ 2
    @edis0n0 “排除指定 IP 段以外的所有 IP 地址段”,如果只需要结果不需要算法的话,这里有个用于计算 wireguard allowedips 的 py 脚本可以做到:
    https://www.lautenbacher.io/en/lamp-en/wireguard-exclude-a-single-ip-address/
    folnet
        12
    folnet  
       2023-01-20 23:03:34 +08:00
    python 用 netaddr 进行判断
    bao3
        13
    bao3  
       2023-01-21 09:15:25 +08:00 via iPhone
    你把这些 IP 的掩码转化成二进制,对比二进制就行了
    qingcheng
        14
    qingcheng  
       2023-01-21 12:27:40 +08:00
    如果要网段或者 IP 少的话逐一比对就可以了,匹配大量 IP 和大量子网的话就用 Trie 吧
    ChristianSwift
        15
    ChristianSwift  
       2023-01-21 21:55:31 +08:00 via iPhone
    为什么不问问神奇的 ChatGPT 呢
    UnknoownUser
        16
    UnknoownUser  
       2023-01-23 15:06:56 +08:00 via iPhone
    使用 32 个变量的逻辑运算,一位就是一个 x ,把表达式写出来,用二元决策图( BDD )计算
    zmcity
        17
    zmcity  
       2023-01-28 13:49:14 +08:00
    开一个 256 长度的 bool 数组查表呗。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3045 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 00:35 · PVG 08:35 · LAX 16:35 · JFK 19:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.