大佬教程收集整理的这篇文章主要介绍了IP 地址验证(小于或等于另一个 IP 地址),大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
如标题所示,我有 2 个 Ipaddress
对象:
var fromIP = Ipaddress.Parse("127.0.01");
var toIP = Ipaddress.Parse("255.255.255.255");
我如何断言 fromIP
对 <=
是 toIP
?
我有一个笨拙的解决方案 - 按 .
分割并遍历 Ipaddress
问题的 4 个组件中的每一个,并按顺序检查每个组件。我不确定这是否未能涵盖我遗漏的 IPv4/IPv6 规范的特定部分?或者是否有“更好”的方法来涵盖所有情况。
IPv4 地址的点分十进制表示法只是编写 32 位 int 的一种友好方式:我们取出每个字节,写出其十进制表示,并用句点分隔它们。
因此,每个 IP 地址都可以表示为一个 32 位的 int,并且可以直接进行比较。
IPv4 地址的 4 个原始字节可以用 Ipaddress.GetAddressBytes()
读取。从那里,我们可以使用 BinaryPrimitives.ReadUInt32Bigendian
作为将这些转换为大端无符号 32 位整数的简单方法:
var ipaddress = Ipaddress.Parse("127.0.0.1");
uint ipInt = BinaryPrimitives.ReadUInt32Bigendian(ipaddress.GetAddressBytes());
然后您可以按照正常方式比较您的两个 uints
。
如果您想将 IP 地址作为有符号整数而不是无符号整数进行比较,您可以执行类似的操作:
var ipaddress = Ipaddress.Parse("127.0.0.1");
int ipInt = BinaryPrimitives.ReadInt32Bigendian(ipaddress.GetAddressBytes());
BinaryPrimitives
是在 .NET Standard 2.1 中引入的。如果您坚持使用较旧的内容,则可以使用 BitConverter
。但是,BitConverter
使用主机的字节序,而 IP 地址中的字节始终是大端字节序,因此您必须在它们之间进行转换:
uint ipInt = unchecked((uint)Ipaddress.NetworkToHostOrder(BitConverter.ToInt32(ipaddress.GetAddressBytes())));
对于签名版,简单一点:
int ipInt = Ipaddress.NetworkToHostOrder(BitConverter.ToInt32(ipaddress.GetAddressBytes()));
,
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.serialization;
using System.Net;
namespace ConsoleApplication
{
public class Program
{
public static void Main(String[] args)
{
Ipaddress ip1 = Ipaddress.Parse("127.0.01");
Ipaddress ip2 = Ipaddress.Parse("255.255.255.255");
int results = (new CompareIP(ip1)).CompareTo(new CompareIP(ip2));
}
}
public class CompareIP : IComparable<CompareIP>
{
private byte[] ipaddress { get; set; }
public CompareIP(Ipaddress ipaddress)
{
this.ipaddress = ipaddress.GetAddressBytes();
}
public int CompareTo(CompareIP other)
{
int results = 0;
for (int i = 0; i < ipaddress.Length; i++)
{
results = this.ipaddress[i].CompareTo(other.ipaddress[i]);
if (results != 0) break;
}
return results;
}
}
}
使用 Icomparer
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.serialization;
using System.Net;
namespace ConsoleApplication
{
public class Program
{
public static void Main(String[] args)
{
Ipaddress ip1 = Ipaddress.Parse("127.0.0.1");
Ipaddress ip2 = Ipaddress.Parse("255.255.255.255");
int results = (new CompareIP()).Compare(ip1,ip2);
}
}
public class CompareIP : IComparer<Ipaddress>
{
public int Compare(Ipaddress ip1,Ipaddress ip2)
{
int results = 0;
byte[] ip1Bytes = ip1.GetAddressBytes();
byte[] ip2Bytes = ip2.GetAddressBytes();
for (int i = 0; i < ip1Bytes.Length; i++)
{
results = ip1Bytes[i].CompareTo(ip2Bytes[i]);
if (results != 0) break;
}
return results;
}
}
}
以上是大佬教程为你收集整理的IP 地址验证(小于或等于另一个 IP 地址)全部内容,希望文章能够帮你解决IP 地址验证(小于或等于另一个 IP 地址)所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。