3

スラッシュ表記 (24、30 など) をサブネット マスクに変換するこの (宿題ではない) 演習を検討してください。

a をにコピーするBitArraybyte[]、内部の順序付けによってBitArray誤った出力が発生します。

たとえば、 の入力ではnumberOfSetBits=24ToString()が返さ255.255.255.0れます (ビットが対称であるため、これが機能します)。ただし、 を入力すると、予想される ではなく が30返されます。はい、それが BitArray が子を処理する方法であることを認識しています(この問題については古い議論がありますが、残念ながら解決策はなく、1 つの順序付けが優れている理由についての終わりのない議論です)。255.255.255.63255.255.255.252

しかし、神への愛のために、このコードを(=63)1111 1100にマングルするのではなく、それが何であるかを処理する (=252) ようにするにはどうすればよいでしょうか? 0011 1111そもそもビットを追加する順序を変更する必要があると思いますが、うまくいきません。

public class SubnetMask
{
    private byte[] parts = new byte[4];

    public static SubnetMask FromSlash(int numberOfSetBits)
    {
        BitArray bits = new BitArray(32);
        for (int i = 0; i < numberOfSetBits; i++)
        {
            bits[i] = true;
        }
        return new SubnetMask(bits);
    }

    private SubnetMask(BitArray bits)
    {
        bits.CopyTo(parts, 0);
    }

    public override string ToString()
    {
        return string.Join(".", parts);
    }
}

ありがとうございました。

4

2 に答える 2

2

これは、次のようにするだけで修正されませんか?

int bitPlace = 32;
for (int i = 0; i < numberOfSetBits; i++)
{
    bits[--bitPlace] = true;
}

これにより、(下位ビットではなく) 上位ビットが設定されます。ここでの理由は、あなたがリンクした回答に正確に記載されていることです11111000000000.

(Most Significant)                  (Least Significant)
 1    1    1    1    1   0   0   0   0   0   0   0   0   0
[14] [13] [11] [10] [9] [8] [7] [6] [5] [4] [3] [2] [1] [0]
于 2012-05-29T21:52:44.273 に答える
2

は必要ありませんBitArray。整数をシフトしてマスクを作成し、BitConverter.GetBytesそれをバイトとして取得するために使用できます。

public static SubnetMask FromSlash(int numberOfSetBits) {
  int mask = numberOfSetBits == 0 ? 0 : -1 << (32 - numberOfSetBits);
  byte[] bits = BitConverter.GetBytes(mask);
  if (BitConverter.IsLittleEndian) Array.Reverse(bits);
  return new SubnetMask(bits);
}
于 2012-05-29T21:58:23.493 に答える