3

请考虑将斜杠符号(例如 24、30)转换为子网掩码的这个(非家庭作业)练习。

当我将 a 复制BitArraybyte[]时,内部排序BitArray导致输出不正确。

例如,输入numberOfSetBits=24,ToString()应该返回255.255.255.0(这是有效的,因为位是对称的)。但是,30结果的输入255.255.255.63而不是预期的255.255.255.252。是的,我意识到这只是 BitArray 处理它的孩子的方式(有一个关于这个问题的旧讨论,不幸的是没有解决方案,只是关于为什么一个排序会更好的永无止境的争论)。

但是,看在上帝的份上,我怎样才能让这段代码按原样处理1111 1100(=252)而不是把它改成0011 1111(=63)?我相信我必须首先更改添加位的顺序,但我无法让它工作。

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;
}

这将设置高位(而不是低位)。这里的推理正是您链接的答案中提到的 - BitArray 将最低有效数字存储在最低索引中,因此11111000000000下面的位数组是 [indexed] 因此:

(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

您不需要 a 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 回答