C# 用C语言计算子网掩码中的位数#
我有一项任务要用C#来完成。我有一个子网掩码:255.255.128.0 我需要找到子网掩码中的位数,在本例中为17 但是,我需要能够在不使用System.Net库的情况下在C#中执行此操作(我正在编程的系统无法访问此库) 看起来这个过程应该是这样的: 1) 将子网掩码拆分为八位字节 2) 将八位字节转换为二进制 3) 计算每个八位组中的一个数 4) 输出找到的总数量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#相当差。有没有人有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