我正在开发一个需要能够处理MAC和IP地址的项目。在这个特定的项目中,我有一个测量值和一个上限和下限来比较它,即测量值必须在上限/下限范围内。测量和上限/下限都可以是MAC地址,IP地址,十六进制,bin等。是否可以以编程方式检查MAC / IP地址是否在特定范围内?在这一点上,我猜我必须将MAC或IP地址转换为十六进制或二进制,并进行比较。欢迎任何其他建议。
更新:使用提供的链接alexn中的信息,我实施了Richard Szalay的课程,以便为其他需要的人检查IP地址范围。
/// <summary>
/// Used for evaluating IPAddress ranges. Class courtesy of Richard Szalay's solution on http://stackoverflow.com/questions/2138706/c-how-to-check-a-input-ip-fall-in-a-specific-ip-range
/// </summary>
class IPAddressRange
{
private Byte[] _upperBytes, _lowerBytes;
private AddressFamily _addressFamily;
public IPAddressRange(IPAddress upper, IPAddress lower)
{
this._addressFamily = lower.AddressFamily;
this._upperBytes = upper.GetAddressBytes();
this._lowerBytes = lower.GetAddressBytes();
}
public Byte[] upperBytes
{
get { return _upperBytes; }
set { this._upperBytes = value; }
}
public Byte[] lowerBytes
{
get { return _lowerBytes; }
set { this._lowerBytes = value; }
}
/// <summary>
/// Determines if the IPAddress is within the range of the upper and lower limits defined in this class instance
/// </summary>
/// <param name="address">An address to check against pre-defined upper and lower limits</param>
/// <returns>True, if it's within range, false otherwise.</returns>
public bool IsInRange(IPAddress address)
{
if (address.AddressFamily != _addressFamily)
{
return false;
}
byte[] addressBytes = address.GetAddressBytes();
bool lowerBoundary = true, upperBoundary = true;
for (int i = 0; i < this.lowerBytes.Length &&
(lowerBoundary || upperBoundary); i++)
{
if ((lowerBoundary && addressBytes[i] < lowerBytes[i]) ||
(upperBoundary && addressBytes[i] > upperBytes[i]))
{
return false;
}
lowerBoundary &= (addressBytes[i] == lowerBytes[i]);
upperBoundary &= (addressBytes[i] == upperBytes[i]);
}
return true;
}
}
@JYelton - 感谢您的帮助,我将为MAC地址开发类似的类,实现您概述的方法。在稍后的迭代中,我可以消除这些类,支持你的极简主义方法。
答案 0 :(得分:1)
这是Richard Szalay在另一个问题上在StackOverflow开发的一个很好的类。
How to check a input IP fall in a specific IP range
这是一个很好的类,可以让你检查IP在指定范围内的情况。
您需要检查MAC和IP吗?
答案 1 :(得分:1)
我想出了以下示例。
很容易找到将IP地址转换为数字的方法,因此我将链接包含在我从中派生出来的方法中。
我正在使用正则表达式来测试输入数据是否与模式匹配,可以根据需要随意省略或更改。 (例如,Unix样式的MAC地址使用冒号(:)而不是连字符( - )。)
要转换MAC地址,我只是省略分隔符并将整个字符串解析为long int。
在我的示例中,我显示了几个示例IP和MAC地址转换的数字,因此您可以定义上限和下限并测试各种组合。
using System.Globalization;
using System.Text.RegularExpressions;
string IP_UpperLimit = "192.168.1.255";
string IP_LowerLimit = "192.168.1.1";
string Mac_UpperLimit = "99-EE-EE-EE-EE-EE";
string Mac_LowerLimit = "00-00-00-00-00-00";
string IP_WithinLimit = "192.168.1.100";
string IP_OutOfBounds = "10.10.1.1";
string Mac_WithinLimit = "00-AA-11-BB-22-CC";
string Mac_OutOfBounds = "AA-11-22-33-44-55";
Console.WriteLine("IP Addresses:");
Console.WriteLine("Upper Limit: " + ConvertIP(IP_UpperLimit));
Console.WriteLine("Lower Limit: " + ConvertIP(IP_LowerLimit));
Console.WriteLine("IP_WithinLimit: " + ConvertIP(IP_WithinLimit));
Console.WriteLine("IP_OutOfBounds: " + ConvertIP(IP_OutOfBounds));
Console.WriteLine();
Console.WriteLine();
Console.WriteLine("Mac Addresses:");
Console.WriteLine("Upper Limit: " + ConvertMac(Mac_UpperLimit));
Console.WriteLine("Lower Limit: " + ConvertMac(Mac_LowerLimit));
Console.WriteLine("Mac_WithinLimit: " + ConvertMac(Mac_WithinLimit));
Console.WriteLine("Mac_OutOfBounds: " + ConvertMac(Mac_OutOfBounds));
long ConvertIP(string IP)
{
// http://www.justin-cook.com/wp/2006/11/28/convert-an-ip-address-to-ip-number-with-php-asp-c-and-vbnet/
Regex r = new Regex(@"\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b");
if (!r.Match(IP).Success) return 0L;
string[] IPSplit = IP.Split('.');
long IPNum = 0L;
for (int i = IPSplit.Length - 1; i >= 0; i--)
IPNum += ((Int64.Parse(IPSplit[i]) % 256) * (long)Math.Pow(256, (3 - i)));
return IPNum;
}
long ConvertMac(string Mac)
{
Regex r = new Regex(@"^[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}-[0-9A-F]{2}$");
if (!r.Match(Mac).Success) return 0L;
return Int64.Parse(Mac.Replace("-", String.Empty), NumberStyles.HexNumber);
}
因此,要使用这些方法,只需对转换后的值执行一些比较:
bool IPIsGood = ConvertIP(IP_UpperLimit) >= ConvertIP(IP_Test) &&
ConvertIP(IP_LowerLimit) <= ConvertIP(IP_Test);