2011-08-03 19 views

Odpowiedz

16

tylko dla zabawy:

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

To * jest * sposobem na zrobienie tego samemu. – LukeH

+0

Czy nie powinieneś raczej uzyskać ostatni bajt według indeksu? 'var bytes = IPAddress.Parse (" 192.168.1.33 "). GetAddressBytes(); var value = bytes [bytes.Length - 1]; 'To spowodowałoby kompatybilność z IPv6 itp. –

+0

1+ ipv4 lub ipv6 to jest sposób .... – Damith

-1

To może być przesadą, ale proste regex również rade:

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

Wydaje się to zbyt duże dla prostego problemu. –

-1

Remember jaki jest adres IP, jest to 32-bitowy (4-bajtowy) numer. Zatem maskowanie adresu maską podsieci byłoby właściwie właściwym sposobem. Jeśli zawsze potrzebujesz maski podsieci 255.255.255.0, jak sugeruje Twoje pytanie, możesz & numerować z 0xFF, aby uzyskać numer.

Ale jeśli nie zależy Ci na wydajności, a adres ma tylko łańcuch, podział na "." jest dobrze ... :)

1

Tak dla zabawy napisałem wersję, która miałaby najmniejszego narzut (ciąg manipulacji itd.). @rushui ma jednak poprawną odpowiedź.

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; 
} 
Powiązane problemy