gpt4 book ai didi

java - 如何以 cidr 表示法搜索 IP 地址

转载 作者:可可西里 更新时间:2023-11-01 08:41:47 41 4
gpt4 key购买 nike

我需要在 mysql 数据库中使用以下 IP 地址“192.168.0.1/20”搜索条目

注意:存储的 ip 地址是 varchars(例如 192.168.0.3,192.168.0.4)

Address:   192.168.0.1          11000000.10101000.0000 0000.00000001
Netmask: 255.255.240.0 = 20 11111111.11111111.1111 0000.00000000
Wildcard: 0.0.15.255 00000000.00000000.0000 1111.11111111
=>
Network: 192.168.0.0/20 11000000.10101000.0000 0000.00000000
HostMin: 192.168.0.1 11000000.10101000.0000 0000.00000001
HostMax: 192.168.15.254 11000000.10101000.0000 1111.11111110
Broadcast: 192.168.15.255 11000000.10101000.0000 1111.11111111
Hosts/Net: 4094 Class C, Private Internet

我的解决方案是根据给定的 cidr 符号(将 0 替换为“*”)找到网络地址,并在数据库中搜索 192.168.*.* 条目,因为它们存储在字符串中。它有效,但我不确定这是否正确

有什么能指出问题所在或比这更优化的解决方案吗?

最佳答案

如果每个 VARCHAR 字段只有一个 IP 地址,则以下方法有效。

使用网络掩码将 IP 地址与其网络匹配的正确方法是通过 INET_ATON()/INET_NTOA() .

虽然有几个步骤。首先使用以下将您的长度转换为子网掩码:

SET @l=20;
SELECT INET_NTOA(0xffffffff >> (32-@l) << (32-@l));

这只是为了传达这个想法,要使它有用,您可以执行以下操作:

SELECT 0xffffffff >> (32-@l) << (32-@l) INTO @mask;


对于地址与您的网络地址的实际匹配,您可以使用带位运算符的 INET_ 函数,例如:

SET @l=20;
SET @nw='192.168.0.0';
SELECT 0xffffffff >> (32-@l) << (32-@l) INTO @mask;
SELECT * FROM yourtable
WHERE (INET_ATON(addrfield) & @mask) = INET_ATON(@nw);

当然,您可以将其合并为一个语句,例如:

SELECT * FROM yourtable 
WHERE (INET_ATON(addrfield) & (0xffffffff >> (32-@l) << (32-@l))) = INET_ATON('192.168.0.0');

关于java - 如何以 cidr 表示法搜索 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33037582/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com