c# - 如何从此格式获取这些范围内的所有 IP 地址?
问题描述
如何从这种格式中计算出该范围内的所有 IP 地址?
213.159.160.0-213.159.191.255
84.44.115.72-84.44.115.79
我找到了84.44.115.1/23
格式的示例,但在上面的格式中没有找到。
解决方案
像这样的东西呢?:
public static IPAddress[] GetAddresses(string rangeString)
{
var match = Regex.Match(rangeString, @"(?<ip1>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})-(?<ip2>\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})");
if (!match.Success || !IPAddress.TryParse(match.Groups["ip1"].Value, out IPAddress ip1) || !IPAddress.TryParse(match.Groups["ip2"].Value, out IPAddress ip2))
{
throw new ArgumentException("Range invalid.");
}
return GetAddresses(ip1, ip2);
}
public static IPAddress[] GetAddresses(IPAddress startAddress, IPAddress endAddress)
{
var startNumber = IPToNumber(startAddress);
var endNumber = IPToNumber(endAddress);
var addresses = new List<IPAddress>();
for (uint i = startNumber; i <= endNumber; ++i)
{
addresses.Add(NumberToIP(i));
}
return addresses.ToArray();
}
private static UInt32 IPToNumber(IPAddress ip)
{
var bytes = ip.GetAddressBytes();
UInt32 result = 0;
for (int i = 0; i < bytes.Length; ++i)
{
result *= 255;
result += bytes[i];
}
return result;
}
private static IPAddress NumberToIP(UInt32 number)
{
var bytes = new Stack<byte>(4);
while (number > 0)
{
bytes.Push((byte)(number % 255));
number /= 255;
}
return new IPAddress(bytes.ToArray());
}
它将开始和地址转换为UInt32
值,并以数字方式循环,将索引转换回 IPAddress 对象。
我不确定您是否需要实际解析范围字符串,因此我将其作为单独的方法添加到顶部。如果您确实需要它,您可以将这些方法合二为一,否则请随意忽略它。
推荐阅读
- python - model.fit 设置需要 30 分钟,但运行一个 epoch 只需 3ms
- javascript - 什么是模式正则表达式来删除属性但值不同?
- kubernetes - 在 Grafana 上使用 Prometheus 获取 Pod 的部署年龄或上次重启时间
- python - R unnest_token() 与 Python pandas str.split() 中的正则表达式行为
- join - Pyspark - 如何根据查找表重命名列名?
- jquery - Kendo Grid Detail Init 事件未在 IE 浏览器中触发
- sql - MariaDB 列按小时分组,行按标题分组
- c# - Linq 到对象,列表
,其中项目由列表组成 - javascript - 使用 Date.now() 的 javascript 中的 1 秒间隙
- java - java源文件的编码