Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何填充一个位数组,以便将其复制到一个字节 请考虑将斜杠符号(例如24, 30)转换成子网掩码的(非作业)练习。_C#_Bit Manipulation_Bitarray - Fatal编程技术网

C# 如何填充一个位数组,以便将其复制到一个字节 请考虑将斜杠符号(例如24, 30)转换成子网掩码的(非作业)练习。

C# 如何填充一个位数组,以便将其复制到一个字节 请考虑将斜杠符号(例如24, 30)转换成子网掩码的(非作业)练习。,c#,bit-manipulation,bitarray,C#,Bit Manipulation,Bitarray,当我将位数组复制到字节[]时,位数组的内部顺序会导致不正确的输出。 例如,输入numberOfSetBits=24,ToString()应返回255.255.255.0(这是因为位是对称的)。 但是,输入30会导致255.255.255.63,而不是预期的255.255.255.252。 是的,我意识到了这一点(关于这个问题有很多争论,不幸的是没有解决方案,只是一个关于为什么一次订购会更好的永无休止的争论) 但是,看在上帝的份上,我怎样才能让这个密码来对待它是什么而不是把它弄坏呢?我相信我将不得

当我将
位数组
复制到
字节[]
时,
位数组
的内部顺序会导致不正确的输出。

例如,输入
numberOfSetBits=24
ToString()
应返回
255.255.255.0
(这是因为位是对称的)。 但是,输入
30
会导致
255.255.255.63
,而不是预期的
255.255.255.252
。 是的,我意识到了这一点(关于这个问题有很多争论,不幸的是没有解决方案,只是一个关于为什么一次订购会更好的永无休止的争论)

但是,看在上帝的份上,我怎样才能让这个密码来对待它是什么而不是把它弄坏呢?我相信我将不得不改变我在第一位添加位的顺序,但我无法让它工作

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);
    }
}
公共类子网掩码
{
专用字节[]部分=新字节[4];
来自斜杠的公共静态子网掩码(整数)
{
位数组位=新的位数组(32);
for(int i=0;i

谢谢。

这不是可以通过以下方式解决的:

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

您不需要
位数组
,您可以通过移位整数来创建掩码,并使用
位转换器.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);
}
sprash中的公共静态子网掩码(int numberofsetbit){

int mask=numberOfSetBits==0?0:-1@Mehrdad nice one-记下另一个我不知道存在的类:-)@ChrisShain:lol。我想你的意思是
struct
:p这确实有效,但是它需要在
子网掩码中进行此更改:
parts=parts.Reverse().ToArray()
修复字节的顺序。谢谢你的努力-我投了赞成票,但我只能设置一个post作为答案。有趣的是,它对0的输入不起作用。有什么解释为什么将整数左移32位会让我保留原来的整数吗?@codesparkle:啊……移位只使用第二个操作数的五位,即
x这很烦人..我想知道为什么必须这样限制。你能更新你的答案以反映这一点吗?例如
numberOfSetBits==0?0:-1
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);
}