2011-08-03 84 views

回答

16

只是爲了好玩:

Console.WriteLine(IPAddress.Parse("192.168.1.33").GetAddressBytes()[3]); 
+2

這*是*通過書本完成的方式。 – LukeH

+0

你不應該通過索引得到最後一個字節嗎? 'var bytes = IPAddress.Parse(「192.168.1.33」)。GetAddressBytes(); var value = bytes [bytes.Length - 1];'這會使它與IPv6等兼容。 –

+0

1+ ipv4或ipv6這是方式.... – Damith

-1

這可能是矯枉過正,但一個簡單的正則表達式也將這樣的伎倆:

(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3}) 
+0

這似乎太多了一個簡單的問題。 –

-1

記住什麼是IP地址,它是一個32位(4字節)的數字。所以用子網掩碼掩蓋地址實際上是正確的方式。如果你總是想要一個255.255.255.0的子網掩碼,就像你的問題所暗示的那樣,你可以用0xFF的號碼&來獲取該號碼。

但是,如果您不關心效率,並且只將地址作爲字符串,則分割爲「。」。只是罰款... :)

1

只是爲了好玩,我寫這將有最少的開銷(字符串操作等)的版本。 @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; 
} 
相關問題