จะแปลงที่อยู่ IPv4 เป็นจำนวนเต็มใน C # ได้อย่างไร?


103

ฉันกำลังมองหาฟังก์ชันที่จะแปลงที่อยู่ IPv4 มาตรฐานเป็นจำนวนเต็ม คะแนนโบนัสสำหรับฟังก์ชันที่จะทำในสิ่งที่ตรงกันข้าม

สารละลายควรอยู่ใน C #


15
คำเตือน : จำนวนเต็มที่เกิดจากคำตอบที่ยอมรับจะไม่ถูกต้องเนื่องจากที่อยู่ IP อยู่ในลำดับเครือข่าย (big-endian) ในขณะที่ints เป็นจำนวนเต็มน้อยในระบบส่วนใหญ่ ดังนั้นคุณต้องย้อนกลับไบต์ก่อนที่จะแปลง ดูคำตอบของฉันสำหรับการแปลงที่ถูกต้อง นอกจากนี้แม้สำหรับ IPv4 เป็นintไม่สามารถถืออยู่มีขนาดใหญ่กว่า127.255.255.255, เช่นuintที่ออกอากาศเพื่อใช้
แสบอามินี

คำตอบ:


141

จำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อคือที่อยู่ IPv4 ในขณะเดียวกันIPAddress.Addressคุณสมบัติในขณะที่เลิกใช้แล้วคือ Int64 ที่ส่งคืนค่า 32 บิตที่ไม่ได้ลงชื่อของที่อยู่ IPv4 (สิ่งที่จับได้คืออยู่ในลำดับไบต์ของเครือข่ายดังนั้นคุณต้องสลับไปมา)

ยกตัวอย่างเช่น google.com 64.233.187.99ท้องถิ่นของฉันอยู่ที่ เทียบเท่ากับ:

64*2^24 + 233*2^16 + 187*2^8 + 99
= 1089059683

และแน่นอน http: // 1089059683 /ทำงานได้ตามที่คาดไว้ (อย่างน้อยใน Windows ทดสอบกับ IE, Firefox และ Chrome ไม่ทำงานบน iPhone)

นี่คือโปรแกรมทดสอบเพื่อแสดงการแปลงทั้งสองรวมถึงการแลกเปลี่ยนไบต์เครือข่าย / โฮสต์:

using System;
using System.Net;

class App
{
    static long ToInt(string addr)
    {
        // careful of sign extension: convert to uint first;
        // unsigned NetworkToHostOrder ought to be provided.
        return (long) (uint) IPAddress.NetworkToHostOrder(
             (int) IPAddress.Parse(addr).Address);
    }

    static string ToAddr(long address)
    {
        return IPAddress.Parse(address.ToString()).ToString();
        // This also works:
        // return new IPAddress((uint) IPAddress.HostToNetworkOrder(
        //    (int) address)).ToString();
    }

    static void Main()
    {
        Console.WriteLine(ToInt("64.233.187.99"));
        Console.WriteLine(ToAddr(1089059683));
    }
}

2
ได้รับการยืนยันใน Opera 11 บน Ubuntu Linux 10.04: มันจะแปลง int กลับเป็นแบบฟอร์ม wxyz ที่คุ้นเคยและใช้งานได้
Piskvor ออกจากอาคาร

6
IPAddress.Address ล้าสมัยเมื่อ. Net 4.0
Erik Philips

@ErikPhilips นั่นสำคัญหรือไม่ถ้าคุณใช้ IPv4 เท่านั้น
Ray

นั่นเป็นการตัดสินใจทางสถาปัตยกรรม มันมีข้อดีข้อเสียและความคิดเห็นไม่ใช่สถานที่ที่ดีที่สุดในการอภิปรายปัญหานั้น ๆ
Erik Philips

2
คุณอาจใช้ BitConverter ToUInt32 (IPAddress.Parse (value) .GetAddressBytes () ย้อนกลับ () ToArray () เพื่อแก้ไข IPAddress.Address ล้าสมัย
Mhmd

43

ต่อไปนี้เป็นวิธีการแปลงจาก IPv4 เป็นจำนวนเต็มและย้อนกลับที่ถูกต้อง :

public static uint ConvertFromIpAddressToInteger(string ipAddress)
{
    var address = IPAddress.Parse(ipAddress);
    byte[] bytes = address.GetAddressBytes();

    // flip big-endian(network order) to little-endian
    if (BitConverter.IsLittleEndian)
    {
        Array.Reverse(bytes);
    }

    return BitConverter.ToUInt32(bytes, 0);
}

public static string ConvertFromIntegerToIpAddress(uint ipAddress)
{
    byte[] bytes = BitConverter.GetBytes(ipAddress);

    // flip little-endian to big-endian(network order)
    if (BitConverter.IsLittleEndian)
    {
        Array.Reverse(bytes);
    }

    return new IPAddress(bytes).ToString();
}

ตัวอย่าง

ConvertFromIpAddressToInteger("255.255.255.254"); // 4294967294
ConvertFromIntegerToIpAddress(4294967294); // 255.255.255.254

คำอธิบาย

ที่อยู่ IP อยู่ในลำดับเครือข่าย (big-endian) ในขณะที่ints เป็น little-endian บน Windows ดังนั้นเพื่อให้ได้ค่าที่ถูกต้องคุณต้องย้อนกลับไบต์ก่อนที่จะแปลงเป็นระบบ little-endian

นอกจากนี้แม้กระทั่งสำหรับIPv4การintไม่สามารถถืออยู่มีขนาดใหญ่กว่า127.255.255.255เช่นที่อยู่ออกอากาศเพื่อให้การใช้งาน(255.255.255.255)uint


สิ่งนี้ดูเหมือนจะไม่สร้างความแตกต่างใน Windows ที่ใช้. NET - ไม่แน่ใจเกี่ยวกับ Mono ดูdotnetfiddle.net/cBIOj2
Jesse

2
@Jesse เกิดขึ้นเพื่อไม่สร้างความแตกต่างให้กับอินพุตของคุณ1.1.1.1เนื่องจากอาร์เรย์ไบต์ของมันเป็นแบบ palindromic ลองกับคนที่ไม่ใช่ palindromic เหมือนหรือ127.0.0.1 192.168.1.1
แสบอามินี

ฉันเห็นปัญหา ตัวเลขซ้ำแล้วซ้ำอีกเช่น1.1.1.1, 2.2.2.2, 123.123.123.123เสมอผลผลิตผลเดียวกัน สำหรับคนรุ่นหลังดูซออัพเดท: dotnetfiddle.net/aR6fhc
Jesse

ชอบที่จะทราบว่าฉันต้องใช้System.Net.IPAddressเพื่อให้ได้ผล ใช้งานได้ดี!
Shrout1

1
@Jesse ที่ไม่ได้เป็นเพียงการทำซ้ำหมายเลข แต่สำหรับที่อยู่ IP ของpalindromicทั้งหมด ดังนั้น2.1.1.2จะเหมือนกัน
แสบอามินี

41

@Barry Kelly และ @Andrew Hare จริงๆแล้วฉันไม่คิดว่าการคูณเป็นวิธีที่ชัดเจนที่สุดในการทำเช่นนี้ (ถูกต้องทั้งหมด)

ที่อยู่ IP "จัดรูปแบบ" Int32 สามารถมองเห็นได้ดังโครงสร้างต่อไปนี้

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
struct IPv4Address
{
   public Byte A;
   public Byte B;
   public Byte C;
   public Byte D;
} 
// to actually cast it from or to an int32 I think you 
// need to reverse the fields due to little endian

ดังนั้นในการแปลงที่อยู่ IP 64.233.187.99 คุณสามารถทำได้:

(64  = 0x40) << 24 == 0x40000000
(233 = 0xE9) << 16 == 0x00E90000
(187 = 0xBB) << 8  == 0x0000BB00
(99  = 0x63)       == 0x00000063
                      ---------- =|
                      0x40E9BB63

ดังนั้นคุณสามารถเพิ่มโดยใช้ + หรือคุณสามารถ binairy หรือรวมกันได้ ส่งผลให้เป็น 0x40E9BB63 ซึ่งก็คือ 1089059683 (ในความคิดของฉันมองเป็นเลขฐานสิบหกมันง่ายกว่ามากที่จะเห็นไบต์)

ดังนั้นคุณสามารถเขียนฟังก์ชันเป็น:

int ipToInt(int first, int second, 
    int third, int fourth)
{
    return (first << 24) | (second << 16) | (third << 8) | (fourth);
}

1
ฉันเชื่อว่า ip ถูกระบุด้วยวิธีนี้เพื่ออนุญาตให้เกิดพฤติกรรมดังกล่าวโดยเฉพาะ ... การเปลี่ยนบิตมีประสิทธิภาพมากกว่าไมโครโปรเซสเซอร์ส่วนใหญ่มากกว่าการบดและเพิ่ม
Ape-inago

1
การคูณ @ Ape-inago ด้วยกำลังคงที่ของสองจะถูกปรับให้เหมาะสมเป็นการกะบิต fwiw
Barry Kelly

แทนที่จะเปลี่ยนบิตคุณสามารถใช้LayoutKind.ExplicitและFieldOffsetเพื่อย้อนกลับลำดับที่จัดเก็บไบต์ได้ แน่นอนว่าใช้ได้กับสถาปัตยกรรม endian ตัวน้อยเท่านั้น ตัวอย่างบน GitHub
RubberDuck

2
ต้องชี้ให้เห็นว่าintมีการลงนามดังนั้นหากคุณเปลี่ยน 192 คูณ 24 บิตคุณจะได้จำนวนเต็มลบดังนั้นรหัสนี้จึงเสียเนื่องจากอ็อกเต็ตสูงที่มีบิตสูงในอันดับแรก
Mateusz

12

ลองสิ่งนี้:

private int IpToInt32(string ipAddress)
{
   return BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes().Reverse().ToArray(), 0);
}

private string Int32ToIp(int ipAddress)
{
   return new IPAddress(BitConverter.GetBytes(ipAddress).Reverse().ToArray()).ToString();
}

Reverse()คืนค่าเป็นโมฆะดังนั้นคุณจึงไม่สามารถเรียกToArray()มันได้ (สำหรับผู้อ่านในอนาคต) ให้กำหนดค่าให้กับไบต์ที่กลับด้านจากนั้นคุณสามารถเรียก ToArray ()
Erik Philips

1
Reverse ()เป็นวิธีการขยายของIEnumerable. โค้ดด้านบนใช้ได้อย่างสมบูรณ์
มด

3
วิธีนี้ให้ตัวเลขติดลบสำหรับ IP บางตัว (เช่น 140.117.0.0)
lightxx

7

เนื่องจากไม่มีใครโพสต์รหัสที่ใช้ BitConverterและตรวจสอบความจริงอยู่ที่นี่:

byte[] ip = address.Split('.').Select(s => Byte.Parse(s)).ToArray();
if (BitConverter.IsLittleEndian) {
  Array.Reverse(ip);
}
int num = BitConverter.ToInt32(ip, 0);

และกลับ:

byte[] ip = BitConverter.GetBytes(num);
if (BitConverter.IsLittleEndian) {
  Array.Reverse(ip);
}
string address = String.Join(".", ip.Select(n => n.ToString()));

2
คุณต้องใช้ uint แต่นี่เป็นคำตอบที่ถูกต้องที่สุดที่นี่
RubberDuck

1
@RubberDuck: คุณจะต้องใช้uintถ้าคุณต้องการให้ข้อมูล 32 บิตเป็นตัวเลขที่ไม่ได้ลงนามintก็สามารถเก็บข้อมูลเดียวกันได้ หากคุณต้องการเก็บไว้ในฐานข้อมูลintที่เหมาะสมกว่าคุณต้องมีbigintเพื่อให้สามารถจัดเก็บในรูปแบบที่ไม่ได้ลงนาม
Guffa

1
uint เป็นตัวแทน IMO ที่ดีกว่า int ที่ลงนามต้องการเครื่องหมายเล็กน้อยดังนั้นคุณจึงสูญเสียที่อยู่ที่ด้านบนสุดของช่วง ใช่สามารถเก็บข้อมูลเดียวกันได้ แต่จะแสดงผลเป็นตัวเลขลบซึ่งไม่ใช่ IP ที่ถูกต้องหากคุณพิมพ์ในแถบที่อยู่
RubberDuck

@RubberDuck: ในรูปแบบของuintคุณไม่สามารถพิมพ์ลงในแถบที่อยู่ได้เช่นกันคุณต้องแปลงเป็นรูปแบบข้อความก่อนจึงจะทำได้ เพียงเพราะการใช้รูปแบบที่ง่ายที่สุดในการเปลี่ยนเป็นintข้อความไม่ได้สร้างที่อยู่ IP ที่ใช้งานได้ไม่ใช่ข้อโต้แย้งที่ดีสำหรับการไม่ใช้
Guffa

@RubberDuck: นั่นไม่ใช่uintนั่นคือการแสดงข้อความของuintไฟล์.
Guffa

7

ฉันพบปัญหาบางอย่างกับวิธีแก้ไขปัญหาที่อธิบายไว้เมื่อต้องเผชิญกับที่อยู่ IP ที่มีค่ามาก ผลลัพธ์ก็คือไบต์ [0] * 16777216 thingy จะล้นและกลายเป็นค่า int เชิงลบ สิ่งที่แก้ไขให้ฉันคือการหล่อแบบธรรมดา

public static long ConvertIPToLong(string ipAddress)
{
    System.Net.IPAddress ip;

    if (System.Net.IPAddress.TryParse(ipAddress, out ip))
    {
        byte[] bytes = ip.GetAddressBytes();

        return
            16777216L * bytes[0] +
            65536 * bytes[1] +
            256 * bytes[2] +
            bytes[3]
            ;
    }
    else
        return 0;
}

มองว่าฉันเป็นทางออกที่ดีที่สุด แต่ฉันจะเปลี่ยน 1 บรรทัดฉันจะทำ byte [] bytes = ip.MapToIPv4 () GetAddressBytes ();
Walter Vehoeven

4

สิ่งที่ตรงกันข้ามกับฟังก์ชันของ Davy Landman

string IntToIp(int d)
{
  int v1 = d & 0xff;
  int v2 = (d >> 8) & 0xff;
  int v3 = (d >> 16) & 0xff;
  int v4 = (d >> 24);
  return v4 + "." + v3 + "." + v2 + "." + v1;
}

คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ไหม
Developerium

3

คำถามของฉันถูกปิดฉันไม่รู้ว่าทำไม คำตอบที่ได้รับการยอมรับที่นี่ไม่เหมือนกับสิ่งที่ฉันต้องการ

สิ่งนี้ทำให้ฉันได้ค่าจำนวนเต็มสำหรับ IP ..

public double IPAddressToNumber(string IPaddress)
{
    int i;
    string [] arrDec;
    double num = 0;
    if (IPaddress == "")
    {
        return 0;
    }
    else
    {
        arrDec = IPaddress.Split('.');
        for(i = arrDec.Length - 1; i >= 0 ; i = i -1)
            {
                num += ((int.Parse(arrDec[i])%256) * Math.Pow(256 ,(3 - i )));
            }
        return num;
    }
}

ตราบใดที่คุณสามารถทำการแปลงได้ทั้งสองวิธีฉันไม่เห็นว่าเหตุใดหมายเลขผลลัพธ์จึงต้องถูกต้องตราบเท่าที่มันสอดคล้องกัน
GateKiller

ขึ้นอยู่กับว่าคุณต้องการใช้หมายเลขนี้เพื่ออะไร คุณไม่สามารถใช้การแปลงอื่นในการทำแบบสอบถาม> = และ <= เพื่อค้นหา IP ..
Coolcoder

2

ด้วย UInt32 ในรูปแบบ little-endian ที่เหมาะสมต่อไปนี้เป็นฟังก์ชันการแปลงที่เรียบง่ายสองอย่าง:

public uint GetIpAsUInt32(string ipString)
{
    IPAddress address = IPAddress.Parse(ipString);

    byte[] ipBytes = address.GetAddressBytes();

    Array.Reverse(ipBytes);

    return BitConverter.ToUInt32(ipBytes, 0);
}

public string GetIpAsString(uint ipVal)
{
    byte[] ipBytes = BitConverter.GetBytes(ipVal);

    Array.Reverse(ipBytes);

    return new IPAddress(ipBytes).ToString();
}

2

ประกอบคำตอบข้างต้นหลายคำตอบเป็นวิธีการขยายที่จัดการ Endianness ของเครื่องและจัดการกับที่อยู่ IPv4 ที่แมปกับ IPv6

public static class IPAddressExtensions
{
    /// <summary>
    /// Converts IPv4 and IPv4 mapped to IPv6 addresses to an unsigned integer.
    /// </summary>
    /// <param name="address">The address to conver</param>
    /// <returns>An unsigned integer that represents an IPv4 address.</returns>
    public static uint ToUint(this IPAddress address)
    {
        if (address.AddressFamily == AddressFamily.InterNetwork || address.IsIPv4MappedToIPv6)
        {
            var bytes = address.GetAddressBytes();
            if (BitConverter.IsLittleEndian)
                Array.Reverse(bytes);

            return BitConverter.ToUInt32(bytes, 0);
        }
        throw new ArgumentOutOfRangeException("address", "Address must be IPv4 or IPv4 mapped to IPv6");
    }
}

การทดสอบหน่วย:

[TestClass]
public class IPAddressExtensionsTests
{
    [TestMethod]
    public void SimpleIp1()
    {
        var ip = IPAddress.Parse("0.0.0.15");
        uint expected = GetExpected(0, 0, 0, 15);
        Assert.AreEqual(expected, ip.ToUint());
    }
    [TestMethod]
    public void SimpleIp2()
    {
        var ip = IPAddress.Parse("0.0.1.15");
        uint expected = GetExpected(0, 0, 1, 15);
        Assert.AreEqual(expected, ip.ToUint());
    }
    [TestMethod]
    public void SimpleIpSix1()
    {
        var ip = IPAddress.Parse("0.0.0.15").MapToIPv6();
        uint expected = GetExpected(0, 0, 0, 15);
        Assert.AreEqual(expected, ip.ToUint());
    }
    [TestMethod]
    public void SimpleIpSix2()
    {
        var ip = IPAddress.Parse("0.0.1.15").MapToIPv6();
        uint expected = GetExpected(0, 0, 1, 15);
        Assert.AreEqual(expected, ip.ToUint());
    }
    [TestMethod]
    public void HighBits()
    {
        var ip = IPAddress.Parse("200.12.1.15").MapToIPv6();
        uint expected = GetExpected(200, 12, 1, 15);
        Assert.AreEqual(expected, ip.ToUint());
    }
    uint GetExpected(uint a, uint b, uint c, uint d)
    {
        return
            (a * 256u * 256u * 256u) +
            (b * 256u * 256u) +
            (c * 256u) +
            (d);
    }
}

1

หากคุณสนใจในฟังก์ชั่นนี้ไม่ใช่แค่คำตอบนี่คือวิธีการ:

int ipToInt(int first, int second, 
    int third, int fourth)
{
    return Convert.ToInt32((first * Math.Pow(256, 3))
        + (second * Math.Pow(256, 2)) + (third * 256) + fourth);
}

ด้วยการfirstผ่านfourthการเป็นส่วนของที่อยู่ IPv4


1
ฉันคิดว่ามันจะชัดเจนกว่านี้ถ้าคุณใช้ shift แทน Math.Pow
Mehrdad Afshari

สิ่งนี้จะทำให้เกิดข้อยกเว้นล้นหากอันดับแรก> 127 คำตอบของ Davy Landman คือวิธีที่ดีที่สุดในการดำเนินการนี้
mhenry1384

ลงนาม int32 ดังนั้นมันจะคืนค่าลบ> 127 สำหรับ
Mateusz

1
public bool TryParseIPv4Address(string value, out uint result)
{
    IPAddress ipAddress;

    if (!IPAddress.TryParse(value, out ipAddress) ||
        (ipAddress.AddressFamily != System.Net.Sockets.AddressFamily.InterNetwork))
    {
        result = 0;
        return false;
    }

    result = BitConverter.ToUInt32(ipAddress.GetAddressBytes().Reverse().ToArray(), 0);
    return true;
}

1
    public static Int32 getLongIPAddress(string ipAddress)
    {
        return IPAddress.NetworkToHostOrder(BitConverter.ToInt32(IPAddress.Parse(ipAddress).GetAddressBytes(), 0));
    }

ตัวอย่างข้างต้นจะเป็นวิธีที่ฉันจะไป .. สิ่งเดียวที่คุณอาจต้องทำคือแปลงเป็น UInt32 เพื่อการแสดงผลหรือวัตถุประสงค์ของสตริงรวมถึงการใช้เป็นที่อยู่แบบยาวในรูปแบบสตริง

ซึ่งเป็นสิ่งที่จำเป็นเมื่อใช้ฟังก์ชัน IPAddress.Parse (String) เฮ้อ.


0

นี่คือวิธีแก้ปัญหาที่ฉันทำในวันนี้ (ควรจะ googled ก่อน!):

    private static string IpToDecimal2(string ipAddress)
    {
        // need a shift counter
        int shift = 3;

        // loop through the octets and compute the decimal version
        var octets = ipAddress.Split('.').Select(p => long.Parse(p));
        return octets.Aggregate(0L, (total, octet) => (total + (octet << (shift-- * 8)))).ToString();
    }

ฉันใช้ LINQ แลมบ์ดาและบางส่วนของส่วนขยายใน generics ดังนั้นในขณะที่ให้ผลลัพธ์เดียวกัน แต่ก็ใช้คุณสมบัติภาษาใหม่บางอย่างและคุณสามารถทำได้ในสามบรรทัดของโค้ด

ฉันมีคำอธิบายในบล็อกของฉันหากคุณสนใจ

ไชโย, -jc


0

ฉันคิดว่าสิ่งนี้ผิด: "65536" ==> 0.0.255.255 "ควรเป็น:" 65535 "==> 0.0.255.255" หรือ "65536" ==> 0.1.0.0 "


0

@Davy Ladman การแก้ปัญหาของคุณด้วย shift นั้นมีความสอดคล้องกัน แต่สำหรับ ip ที่เริ่มต้นด้วยเลขน้อยกว่าหรือเท่ากับ 99 เท่านั้นค่า octect แรกจะต้องยาว

อย่างไรก็ตามการแปลงกลับด้วยประเภทยาวนั้นค่อนข้างยากเพราะเก็บ 64 บิต (ไม่ใช่ 32 สำหรับ Ip) และเติม 4 ไบต์ด้วยศูนย์

static uint ToInt(string addr)
{
   return BitConverter.ToUInt32(IPAddress.Parse(addr).GetAddressBytes(), 0);
}

static string ToAddr(uint address)
{
    return new IPAddress(address).ToString();
}

สนุก!

มัสซิโม


0

สมมติว่าคุณมี IP Address ในรูปแบบสตริง (เช่น 254.254.254.254)

string[] vals = inVal.Split('.');
uint output = 0;
for (byte i = 0; i < vals.Length; i++) output += (uint)(byte.Parse(vals[i]) << 8 * (vals.GetUpperBound(0) - i));

0
var ipAddress = "10.101.5.56";

var longAddress = long.Parse(string.Join("", ipAddress.Split('.').Select(x => x.PadLeft(3, '0'))));

Console.WriteLine(longAddress);

เอาท์พุท: 10101005056


0
var address = IPAddress.Parse("10.0.11.174").GetAddressBytes();
long m_Address = ((address[3] << 24 | address[2] << 16 | address[1] << 8 | address[0]) & 0x0FFFFFFFF);

เมธอด GetAddressBytes อาจส่งคืนไบต์ในลำดับย้อนกลับขึ้นอยู่กับว่าเครื่องเป็น endian หรือ endian-ness ดังนั้นคำสั่งที่ถูกต้องอาจเป็นสำหรับบางเครื่อง: long m_Address = (address [0] << 24 | address [1] << 16 | ที่อยู่ [2] << 8 | ที่อยู่ [3]) & 0x0FFFFFFFF
MiguelSlv

0

ฉันสังเกตเห็นว่า System.Net.IPAddress มีคุณสมบัติ Address (System.Int64) และตัวสร้างซึ่งยอมรับชนิดข้อมูล Int64 ด้วย ดังนั้นคุณสามารถใช้สิ่งนี้เพื่อแปลงที่อยู่ IP เป็น / จากรูปแบบตัวเลข (แม้ว่าจะไม่ใช่ Int32 แต่เป็นรูปแบบ Int64)


นี่ควรจะเป็นความคิดเห็นแล้วเห็นว่ามันไม่ตอบคำถาม!
เอียน

-1

ดูตัวอย่างการแยกวิเคราะห์ที่บ้าคลั่งใน. Net ของ IPAddress.Parse: ( MSDN )

"65536" ==> 0.0.255.255
"20.2" ==> 20.0.0.2
"20.65535" ==> 20.0.255.255
"128.1.2" ==> 128.1.0.2


นี่ไม่ใช่คำตอบจริงๆ ทำไมไม่ใส่เป็นความคิดเห็นในคำตอบอันดับต้น ๆ
DanM7
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.