【问题标题】:Best approach to get ipv4 last octet获取最后一个八位字节的 ipv4 的最佳方法
【发布时间】:2011-10-19 03:21:45
【问题描述】:

我知道 substring 可以处理这个问题,但有没有更好的方法从 IP 获取最后一个八位字节?

例如: 192.168.1.100

我想要100

Tks

【问题讨论】:

    标签: c# ip-address


    【解决方案1】:

    只是为了好玩:

    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 等兼容。
    【解决方案2】:

    只是为了好玩,我编写了开销最小的版本(字符串操作等)。 @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;
    }
    

    【讨论】:

      【解决方案3】:

      这可能有点矫枉过正,但一个简单的正则表达式也可以解决问题:

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

      【讨论】:

      • 这对于一个简单的问题来说似乎太多了。
      【解决方案4】:

      记住什么是 IP 地址,它是一个 32 位(4 字节)的数字。所以用子网掩码屏蔽地址实际上是正确的方法。如果您总是想要 255.255.255.0 的子网掩码,正如您的问题所暗示的那样,您可以 & 使用 0xFF 的数字来获取数字。

      但是,如果您不关心效率,并且只将地址作为字符串,则“。”上的拆分很好... :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-13
        • 1970-01-01
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 2016-11-27
        • 1970-01-01
        相关资源
        最近更新 更多