私は正規表現が dangerous であることを知っています。これはIPアドレスの形式が異なるためです。
CとC++についても同様の質問を見てきましたが、C#には存在しない関数で解決されました inet_ntop()
私が見つけた.NETソリューションは、標準の「ddd.ddd.ddd.ddd」形式のみを処理します。助言がありますか?
これを使用して、解析を試行できます。
IPAddress.TryParse
次に、AddressFamily
を確認します
IPv4の場合はSystem.Net.Sockets.AddressFamily.InterNetworkを、IPv6の場合はSystem.Net.Sockets.AddressFamily.InterNetworkV6を返します。
編集:いくつかのサンプルコード。必要に応じて変更します。
string input = "your IP address goes here";
IPAddress address;
if (IPAddress.TryParse(input, out address))
{
switch (address.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
// we have IPv4
break;
case System.Net.Sockets.AddressFamily.InterNetworkV6:
// we have IPv6
break;
default:
// umm... yeah... I'm going to need to take your red packet and...
break;
}
}
System.Net.IpAddress.TryParse()
の使用に関する警告のみ:
整数(例: "3")を含む文字列を渡すと、TryParse関数はそれを "0.0.0.3"に変換するため、有効なInterNetworkV4アドレスになります。したがって、少なくとも、再フォーマットされた「0.0.0.3」はユーザーアプリケーションに返され、ユーザーは入力がどのように解釈されたかを知る必要があります。
string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;
bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
isValidIp
がtrueの場合、ipAddress.AddressFamily
IPv4かIPv6かを判断します。 AddressFamily.InterNetwork
IPv4およびAddressFamily.InterNetworkV6
IPv6の場合。
System.Uri.CheckHostName(value) をチェックアウトできます Unknown
、Dns
、IPv4
、IPv6
。
if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
//then 'value' is a valid IP address or hostname
すべての整数を解析するのではなく、IPのみを解析する場合は、.
IPv4および:
IPv6の場合。
if (input.Contains(".") || input.Contains(":"))
{
IPAddress address;
if (IPAddress.TryParse(input, out address))
{
switch (address.AddressFamily)
{
case AddressFamily.InterNetwork:
return Ip4Address;
case AddressFamily.InterNetworkV6:
return Ip6Address;
}
}
}
IPAddress.GetAddressBytes()。Lengthプロパティを使用できます
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
うまくいくと思う
文字列またはIPAddressに適用されるテストの組み合わせは、私にとってはうまくいきます。
/// <summary>
/// Test string for valid ip address format
/// </summary>
///
/// <param name="Address">The ip address string</param>
///
/// <returns>Returns true if address is a valid format</returns>
public static bool IsValidIP(IPAddress Ip)
{
byte[] addBytes = Ip.GetAddressBytes();
switch (Ip.AddressFamily)
{
case AddressFamily.InterNetwork:
if (addBytes.Length == 4)
return true;
break;
case AddressFamily.InterNetworkV6:
if (addBytes.Length == 16)
return true;
break;
default:
break;
}
return false;
}
/// <summary>
/// Test string for valid ip address format
/// </summary>
///
/// <param name="Address">The ip address string</param>
///
/// <returns>Returns true if address is a valid format</returns>
public static bool IsValidIP(string Address)
{
IPAddress ip;
if (IPAddress.TryParse(Address, out ip))
{
switch (ip.AddressFamily)
{
case System.Net.Sockets.AddressFamily.InterNetwork:
if (Address.Length > 6 && Address.Contains("."))
{
string[] s = Address.Split('.');
if (s.Length == 4 && s[0].Length > 0 && s[1].Length > 0 && s[2].Length > 0 && s[3].Length > 0)
return true;
}
break;
case System.Net.Sockets.AddressFamily.InterNetworkV6:
if (Address.Contains(":") && Address.Length > 15)
return true;
break;
default:
break;
}
}
return false;
}