招聘网站建设人员条件网站免费建站app
我们知道子网掩码是对IP地址的网络地址的标注。把IP地址中网络地址位设置为1,主机地址位设置为0,得到的就是子网掩码。除了用子网掩码表示IP地址的网络地址和主机地址外,还可以用network prefix(网络前缀),比如192.168.0.1/16,这里的16就是prefix,也就是网络地址位的位数
那么CAPL脚本如何实现根据子网掩码获取网络前缀呢?
IP地址由:网络地址+主机地址组成,网络地址位为1,主机地址位为0。那么只需要计算从高位开始的bit位为1的位数有多少,就是网络前缀。比如255.255.0.0,从高位开始的bit位为1的位数有16个,那么prefix就是16
下面是一个有漏洞的函数实现:原因在注释里说明了
int Subnet2Prefix(char subnetString[])
{ip_Address subnetAddr;byte ipv4Array[4];byte subnetArray[16];int i;int prefix;prefix = 0;if (subnetAddr.ParseAddressFromString(subnetString) != 0)return -1;if (subnetAddr.GetAddressAsArray(subnetArray) != 0)//如果不能存储在16位字节数组中,就说明是ipv4{if (subnetAddr.GetAddressAsArray(ipv4Array) == 0)//那么就用4字节数组存储memcpy(subnetArray, ipv4Array, elcount(ipv4Array));//最终还是复制到16字节数组中,这样的好处是不管ipv4还是ipv6,