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