Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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# 用C语言计算子网掩码中的位数#_C#_Mask_Subnet - Fatal编程技术网

C# 用C语言计算子网掩码中的位数#

C# 用C语言计算子网掩码中的位数#,c#,mask,subnet,C#,Mask,Subnet,我有一项任务要用C#来完成。我有一个子网掩码:255.255.128.0 我需要找到子网掩码中的位数,在本例中为17 但是,我需要能够在不使用System.Net库的情况下在C#中执行此操作(我正在编程的系统无法访问此库) 看起来这个过程应该是这样的: 1) 将子网掩码拆分为八位字节 2) 将八位字节转换为二进制 3) 计算每个八位组中的一个数 4) 输出找到的总数量 然而,我的C#相当差。有没有人有C#方面的知识可以提供帮助?您可以像这样将数字转换为二进制: string ip

我有一项任务要用C#来完成。我有一个子网掩码:255.255.128.0

我需要找到子网掩码中的位数,在本例中为17

但是,我需要能够在不使用System.Net库的情况下在C#中执行此操作(我正在编程的系统无法访问此库)

看起来这个过程应该是这样的:

1) 将子网掩码拆分为八位字节

2) 将八位字节转换为二进制

3) 计算每个八位组中的一个数

4) 输出找到的总数量


然而,我的C#相当差。有没有人有C#方面的知识可以提供帮助?

您可以像这样将数字转换为二进制:

        string ip = "255.255.128.0";
        string[] tokens = ip.Split('.');
        string result = "";
        foreach (string token in tokens)
        {
            int tokenNum = int.Parse(token);
            string octet = Convert.ToString(tokenNum, 2);
            while (octet.Length < 8)
                octet = octet + '0';
            result += octet;
        }
        int mask = result.LastIndexOf('1') + 1;
string ip=“255.255.128.0”;
string[]tokens=ip.Split('.');
字符串结果=”;
foreach(令牌中的字符串令牌)
{
int tokenNum=int.Parse(令牌);
字符串八位组=Convert.ToString(tokenNum,2);
while(八位组长度<8)
八位字节=八位字节+0;
结果+=八位字节;
}
int mask=result.LastIndexOf('1')+1;

位计数算法取自:

使用了本文中最简单的算法。如果性能至关重要,您可能希望阅读本文并使用其中更优化的解决方案。

完整示例:

public int CountBit(string mask)
        {

            int ones=0;
            Array.ForEach(mask.Split('.'),(s)=>Array.ForEach(Convert.ToString(int.Parse(s),2).Where(c=>c=='1').ToArray(),(k)=>ones++));
          return ones

        }

解决方法是使用一个
二进制操作

  foreach(string octet in ipAddress.Split('.'))
  {       
      int oct = int.Parse(octet);     
      while(oct !=0) 
      {
              total += oct & 1; // {1}
              oct >>=1;  //{2}          
      }   
  }
诀窍在于,在第{1}行中,
二进制和
是一个乘法,因此乘法
1x0=0
1x1=1
。所以如果我们有一些假设的数字

0000101001
并将其乘以
1
(因此在二进制世界中我们执行&),这与
0000000001
,我们得到

0000101001
0000000001
大多数数字在两个数字中都是
1
,因此使
成为二进制,并返回
1
,否则,如果数字中的任何次位将是
0
,结果将是
0

因此,在这里,在线
total+=oct&1
上,我们根据该数字将
1
0添加到
total

在第{2}行中,我们只是将次位右移,实际上,将数字除以
2
,直到它变成
0

简单

编辑


这对
intgere
byte
类型有效,但不要对
浮点
数字使用此技术。顺便说一句,对于这个问题来说,这是一个非常有价值的解决方案。

在没有任何BCL库的情况下,您到底是如何运行C#的?或者你是说特别是
System.Net
名称空间吗?那么你还没有为你的4个步骤中的任何一个做任何尝试吗?我已经尝试过了,并对它进行了哈希处理,但在尝试执行类似“byte octetByte=byte.Parse(octet);”的操作时遇到了问题。因此,要回答这个问题,请在子网掩码的每个部分使用上面的内容。如果子网掩码是字符串,请在
上拆分并解析数字。然后,计算字符串中1的实例数,可能是
var onesInResult=result.replace(“0”),Length请注意,此解决方案将为“255.255.0.128”提供与“255.255.128.0”相同的结果。但前者不是有效的IPv4子网掩码。所以不能用它来验证掩码。
  foreach(string octet in ipAddress.Split('.'))
  {       
      int oct = int.Parse(octet);     
      while(oct !=0) 
      {
              total += oct & 1; // {1}
              oct >>=1;  //{2}          
      }   
  }
0000101001
0000000001