我有以下两列:
SELECT b.ip_address AS IP ,b.mask AS MASK FROM interfaces b WHERE b.ip_address = 167804290; +-----------+------------+ | IP | MASK | +-----------+------------+ | 167804290 | 4294967168 | +-----------+------------+实际IP地址在哪里是其子网掩码
SELECT INET_NTOA(b.ip_address) AS IP,INET_NTOA(b.mask) AS MASK FROM interfaces b WHERE b.ip_address = 167804290;我试图找到一种方法用mysql来获取实际广播范围,在这种情况下是
+--------------+-----------------+ | IP | MASK | +--------------+-----------------+ | 10.0.125.130 | 255.255.255.128 | +--------------+-----------------+ 1 row in set (0.00 sec)
10.0.125.255
或167804415
,但我看不到它。
我最接近的是
SELECT INET_NTOA(b.ip_address+(POWER(2,32)- b.mask - 1)) FROM interfaces b WHERE 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
任何帮助将不胜感激。
答案 0 :(得分:3)
广播地址是子网掩码的补充,与IP地址进行“或”运算。
SELECT INET_NTOA( ~b.mask & 0xffffffff | b.ip_address)
FROM interfaces b
WHERE b.ip_address = 167804290;
(你必须使用“& 0xffffffff
”进行掩码,因为在MySQL中,按位补码运算符返回64位值。)