1

我有以下两列:

选择 b.ip_address 作为 IP,b.mask 作为接口 b 的掩码,其中 b.ip_address = 167804290;
+-----------+------------+
| 知识产权 | 面膜 |
+-----------+------------+
| 167804290 | 4294967168 |
+-----------+------------+
实际 IP 地址及其子网掩码在哪里
选择 INET_NTOA(b.ip_address) 作为 IP,INET_NTOA(b.mask) 作为接口 b 的掩码,其中 b.ip_address = 167804290;
+--------------+------------------+ | 知识产权 | 面膜 | +--------------+------------------+ | 10.0.125.130 | 255.255.255.128 | +--------------+------------------+ 一组中的 1 行(0.00 秒)
我正在尝试使用 mysql 找到一种方法来获取实际的广播范围,在这种情况下是10.0.125.255or 167804415,但我看不到它。我得到的最接近的是

从接口 b 中选择 INET_NTOA(b.ip_address+(POWER(2,32)- b.mask - 1)) 其中 b.ip_address = 167804290;
+-------------------------------------------------- --+
| INET_NTOA(b.ip_address+(POWER(2,32)- b.mask - 1)) |
+-------------------------------------------------- --+
| 10.0.126.1 |
+-------------------------------------------------- --+

唯一的问题是,这是假设该列ip_address是子网的开始10.0.125.128

任何帮助将不胜感激。

4

1 回答 1

3

广播地址是子网掩码的补码,与 IP 地址进行或运算。

SELECT INET_NTOA( ~b.mask & 0xffffffff | b.ip_address) 
FROM interfaces b 
WHERE b.ip_address = 167804290; 

(你必须用 " & 0xffffffff" 屏蔽,因为在 MySQL 中,按位补码运算符返回一个 64 位值。)

于 2009-02-03T21:52:00.133 回答