如何填充位数组,以便将其复制到字节即可

本文关键字:复制 到字节 何填充 填充 数组 | 更新日期: 2023-09-27 18:35:44

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

当我将BitArray复制到byte[]时,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);
    }
}

谢谢。

如何填充位数组,以便将其复制到字节即可

你不需要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);
}

这不可以通过执行以下操作来解决吗:

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

这将设置高阶位(而不是低阶位)。 这里的推理正是您链接的答案中提到的 - BitArray 将最低有效数字存储在最低索引中,因此下面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]