PowerShell中CIDR生成IP范围函数返回错误结果的原因排查
你的函数存在以下几个关键问题,导致计算结果错误:
起始IP未正确计算网络地址
代码中$startIP的计算只是直接拼接原IP的字节,没有根据子网掩码生成真正的子网起始网络地址。比如输入192.168.1.5/24时,正确起始IP应为192.168.1.0,但你的函数会返回原IP192.168.1.5作为起始地址,不符合CIDR定义。另外,$_ -bor 0的操作完全无意义,任何数值和0按位或都等于自身,不会改变结果。子网大小计算存在精度与溢出问题
[math]::pow(2, (32 - $prefix))返回的是浮点数,转换为[int]时可能出现精度丢失。更严重的是,当32-$prefix等于31时,2^31的值为2147483648,超过32位有符号整数的最大值(2147483647),会触发整数溢出得到负数,导致后续字节处理完全错误。字节序不匹配导致结束IP计算错误
BitConverter.GetBytes([int]$subnet)返回的字节数组是小端序(Windows系统默认),而IP地址的字节采用大端序排列。比如计算/24子网时,$subnet为256,BitConverter.GetBytes([int]256)得到的是0,1,0,0,但IP字节需要的是0,0,1,0。用错位的字节数组和IP字节按位或,必然得到错误的结束IP。结束IP的计算逻辑错误
正确的结束IP应该是网络地址 + 可用地址数 - 1,或者通过网络地址与子网掩码的反码按位或得到。你的代码既没有先获取正确的网络地址,也未处理字节序问题,直接用原IP字节和子网字节按位或,逻辑完全错误。
内容的提问来源于stack exchange,提问作者Sotiris Sotiriou

