如何填充位数组,以便将其复制到字节即可
本文关键字:复制 到字节 何填充 填充 数组 | 更新日期: 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]