gpt4 book ai didi

c# - 如何填充 BitArray 以便将其复制到字节

转载 作者:行者123 更新时间:2023-11-30 15:39:05 25 4
gpt4 key购买 nike

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

当我复制 BitArraybyte[] , 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);
}

关于c# - 如何填充 BitArray 以便将其复制到字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10807146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com