【发布时间】:2011-10-19 03:21:45
【问题描述】:
我知道 substring 可以处理这个问题,但有没有更好的方法从 IP 获取最后一个八位字节?
例如: 192.168.1.100
我想要100
Tks
【问题讨论】:
标签: c# ip-address
我知道 substring 可以处理这个问题,但有没有更好的方法从 IP 获取最后一个八位字节?
例如: 192.168.1.100
我想要100
Tks
【问题讨论】:
标签: c# ip-address
只是为了好玩:
Console.WriteLine(IPAddress.Parse("192.168.1.33").GetAddressBytes()[3]);
【讨论】:
var bytes = IPAddress.Parse("192.168.1.33").GetAddressBytes(); var value = bytes[bytes.Length - 1]; 这将使其与 IPv6 等兼容。
只是为了好玩,我编写了开销最小的版本(字符串操作等)。 @rushui 有正确答案。
static void Main(string[] args)
{
Console.WriteLine(OctetInIP("10.1.1.100", 0));
Console.ReadLine();
}
static byte OctetInIP(string ip, int octet)
{
var octCount = 0;
var result = 0;
// Loop through each character.
for (var i = 0; i < ip.Length; i++)
{
var c = ip[i];
// If we hit a full stop.
if (c == '.')
{
// Return the value if we are on the correct octet.
if (octCount == octet)
return (byte)result;
octCount++;
}
else if (octCount == octet)
{
// Convert the current octet to a number.
result *= 10;
switch (c)
{
case '0': break;
case '1': result += 1; break;
case '2': result += 2; break;
case '3': result += 3; break;
case '4': result += 4; break;
case '5': result += 5; break;
case '6': result += 6; break;
case '7': result += 7; break;
case '8': result += 8; break;
case '9': result += 9; break;
default:
throw new FormatException();
}
if (result > 255)
throw new FormatException();
}
}
if (octCount != octet)
throw new FormatException();
return (byte)result;
}
【讨论】:
这可能有点矫枉过正,但一个简单的正则表达式也可以解决问题:
(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})
【讨论】:
记住什么是 IP 地址,它是一个 32 位(4 字节)的数字。所以用子网掩码屏蔽地址实际上是正确的方法。如果您总是想要 255.255.255.0 的子网掩码,正如您的问题所暗示的那样,您可以 & 使用 0xFF 的数字来获取数字。
但是,如果您不关心效率,并且只将地址作为字符串,则“。”上的拆分很好... :)
【讨论】: