【问题标题】:IP address parsing in .NET.NET 中的 IP 地址解析
【发布时间】:2010-09-27 14:20:21
【问题描述】:

我正在使用 IPAddress.TryParse() 来解析 IP 地址。但是,它有点过于宽松(解析“1”返回 0.0.0.1)。我想将输入限制为点分八位字节表示法。最好的方法是什么?

(注意:我使用的是 .NET 2.0)


编辑

让我澄清一下:

我正在编写一个应用程序,它将扫描一系列 IP 以查找某些设备(基本上是端口扫描器)。当用户输入“192.168.0.1”作为起始地址时,我想自动填写“192.168.0.255”作为结束地址。问题是当他们输入“1”时,它会解析为“0.0.0.1”,而结束地址填写为“0.0.0.255”——看起来很傻。

【问题讨论】:

  • 您是否尝试解析或验证?解析“1”应该返回 0.0.0.1 - 我不明白你所说的“允许”是什么意思,除非你试图验证输入数据是一个 IP 地址
  • 两者,真的。我需要验证用户是否输入了一个带点的八位字节,并将输入转换为 System.Net.IPAddress。

标签: c# .net parsing ip-address


【解决方案1】:

如果您对解析格式感兴趣,那么我会使用正则表达式。这是一个很好的(source):

bool IsDottedDecimalIP(string possibleIP)
{
    Regex R = New Regex(@"\b(?:\d{1,3}\.){3}\d{1,3}\b");
    return R.IsMatch(possibleIP) && Net.IPAddress.TryParse(possibleIP, null);
}

该正则表达式不会捕获无效 IP,但会强制执行您的模式。 TryParse 检查它们的有效性。

【讨论】:

  • 不为我编译...无效的转义字符。我太喜欢调试正则表达式 n00b :(
  • Regex.IsMatch(SubjectString, "\\b(?:[0-9]{1,3}\\.){3}[0-9]{1,3}\\ b")
  • 或 @"\b(?:\d{1,3}\.){3}\d{1,3}\b" 或 "\\b(?:\\d {1,3}\\.){3}\\d{1,3}\\b"
  • @Didistis - 我试过了,但没用,但结果我也传递了错误的字符串。我想你需要同时把所有事情都做好:)
  • 谢谢,乔恩——我总是忘记这个网站上的“@”。
【解决方案2】:

IP 地址实际上是一个 32 位数字 - 它不是 xxx.xxx.xxx.xxx - 这只是人类可读的相同格式。所以IP地址1实际上是0.0.0.1。

编辑:鉴于澄清,您可以按照建议使用正则表达式,或者您可以根据自己的喜好格式化快捷方式,因此如果您希望“1”显示为“1.0.0.0”。您可以附加它并仍然使用 parse 方法。

【讨论】:

  • 对,但是当用户输入“1”时,他的意思可能不是“0.0.0.1”。
猜你喜欢
  • 2011-05-07
  • 2023-04-07
  • 2013-01-27
  • 2015-09-14
  • 1970-01-01
  • 2020-08-06
  • 2014-10-11
  • 1970-01-01
  • 2013-03-25
相关资源
最近更新 更多