IP4 ネットワーク マスク (/19 のような CIDR ブロック サイズに対応) の 1 ビットの数を表す 0 ~ 32 の入力が与えられると、
- それを 4 バイト長のネットマスクに変換するエレガントな方法
- それを 4 バイト長のネットマスクに変換する簡単な方法
プロトタイプ:
Function NetMaskFromBitCount(BitCount As Long) As Long
'Logic here '
End Function
これは、VB6 が unsigned を実行しないという事実によって複雑になることに注意してください。そのため、通常の数学のトリックではうまくいかないことがよくあります。(Number And &H80000000)がゼロでない場合Number \ 2、SHR 操作と同じにはなりません。
いくつかの方法を思いつきましたが、それらはエレガントではないと思いますし、おそらくそれほど高速でもありません。
私が持っていたアイデアの 1 つは、非常に高速な CopyMemory API を戦略的に使用することです。過去に、Long をバイト (0 から 3) にブラットし、必要に応じて各部分を処理することで、署名付き/未署名の Long の問題を解決しました。
私は 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)
実用的なソリューションは優れていますが、私が探しているのは ELEGANT または FAST です。