其他分享
首页 > 其他分享> > CodeGo.net>如何填充一个BitArray,以便将其复制到一个字节将工作

CodeGo.net>如何填充一个BitArray,以便将其复制到一个字节将工作

作者:互联网

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

当我将BitArray复制到byte []时,BitArray的内部排序会导致输出错误.

例如,使用numberOfSetBits = 24输入,ToString()应该返回255.255.255.0(这是可行的,因为位是对称的).
但是,输入30会得到255.255.255.63,而不是预期的255.255.255.252.
是的,我意识到that’s just the way a BitArray handles it’s children(关于这个问题有一个old discussion,不幸的是没有解决方案,只是关于为什么一种排序会更好的一个永无休止的争论).

但是,出于对上帝的爱,我如何才能得到此代码来处理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);
}

标签:bitarray,bit-manipulation,c
来源: https://codeday.me/bug/20191101/1982369.html