给定 0 到 32 的输入,表示 IP4 网络掩码中的一位数(对应于 /19 中的 CIDR 块大小),什么是
- 一种将其转换为四字节长网络掩码的优雅方法
- 一种将其转换为四字节长网络掩码的快速方法
原型:
Function NetMaskFromBitCount(BitCount As Long) As Long
'Logic here '
End Function
请注意,由于 VB6 不做无符号运算,这很复杂,因此常规的数学技巧通常不起作用。如果(Number And &H80000000)
为非零,则Number \ 2
与 SHR 操作不同。
我想出了一些方法,但我不认为它们很优雅,而且它们可能没有那么快。
我的一个想法是战略性地使用 CopyMemory API,它非常快。我过去解决了一些有符号/无符号的 Long 问题,只需将 Long 放入一个字节(0 到 3)并根据需要处理每个部分。
由于我还在使用 inet_ntoa() 和 inet_addr() Windows API 函数,它们以反向字节顺序返回 IP 序列号,因此以反向顺序返回字节的解决方案非常棒(我已经有一个函数来翻转如果需要,字节顺序,但避免它也会很好)。
例子:
Input = 2
Output = -1073741824 (&HC0000000)
Alternate Output = 12 (&HC0, reverse byte order)
Input = 19
Output = -8192 (&HFFFFE000)
Alternate Output = 14745599 (&H00E0FFFF, reverse byte order)
可行的解决方案很好,但我正在寻找优雅或快速的解决方案。