子网掩码转换为二进制后,前面x位都为1,后面x为都为0。通常的子网掩码校验方法基本都是循环校验,实现比较复杂。今天向大家介绍一个简单的校验子网掩码的方法。
假设子网掩码其中一段为mask=11110000
1.对子网掩码取反(或者与0xFFFFFFFF异或),取反后子网掩码为00001111
2.取反后的子网掩码+1,得到m=00010000
3.将子网掩码与上一步的结果按位或,mask|m=11110000
4.我们发现按位或时,m的值不会导致子网掩码变化。

当子网掩码出错时,假设mask=11010000
m=00101111+1=00110000
此时将m与mask按位与时,我们发现m的第三位将会改变mask的值

此外我们不能忽略00000000与11111111的情况,这两种情况比较特殊,可以直接用if判断过滤掉

根据以上分析,我们可以写出判断子网掩码的方法

if(mask<=0 || mask>=0xFFFFFFFFL || (((mask ^ 0xFFFFFFFFL) + 1) | mask) != mask) {
    // 子网掩码错误处理代码
}