代码之家  ›  专栏  ›  技术社区  ›  fernacolo

为什么.NET不使用嵌入的IPv4值解析特定的IPv6?

  •  4
  • fernacolo  · 技术社区  · 6 年前

    在我的计算机中,此代码:

            var someIps = new[]
            {
                "::1.2.3.4",
                "::0000:1.2.3.4",
                "0:0:0:0:0:0:0000:1.2.3.4",
                "1::0000:1.2.3.4",
                "0000:0000:0000:0000:0000:0000:0000:1.2.3.4",
                "::abcd:1.2.3.4",
                "0:0:0:0:0:0:abcd:1.2.3.4",
                "1::abcd:1.2.3.4",
                "0000:0000:0000:0000:0000:0000:abcd:1.2.3.4",
                "::ffff:1.2.3.4",
                "0:0:0:0:0:0:ffff:1.2.3.4",
                "1::ffff:1.2.3.4",
                "0001:0000:0000:0000:0000:0000:ffff:1.2.3.4",
            };
    
            foreach ( var ip in someIps )
            {
                if (IPAddress.TryParse( ip, out var parsed ))
                    Console.WriteLine( "{0} parses to {1}", ip, parsed );
                else
                    Console.WriteLine( "{0} does not parse.", ip, parsed );
            }
    

    生成此输出:

    ::1.2.3.4 parses to ::1.2.3.4
    ::0000:1.2.3.4 parses to ::1.2.3.4
    0:0:0:0:0:0:0000:1.2.3.4 does not parse.
    1::0000:1.2.3.4 parses to 1::102:304
    0000:0000:0000:0000:0000:0000:0000:1.2.3.4 does not parse.
    ::abcd:1.2.3.4 parses to ::abcd:102:304
    0:0:0:0:0:0:abcd:1.2.3.4 does not parse.
    1::abcd:1.2.3.4 parses to 1::abcd:102:304
    0000:0000:0000:0000:0000:0000:abcd:1.2.3.4 does not parse.
    ::ffff:1.2.3.4 parses to ::ffff:1.2.3.4
    0:0:0:0:0:0:ffff:1.2.3.4 does not parse.
    1::ffff:1.2.3.4 parses to 1::ffff:102:304
    0001:0000:0000:0000:0000:0000:ffff:1.2.3.4 does not parse.
    

    为什么要分析 ::ffff:1.2.3.4 ,但无法分析 0:0:0:0:0:0:ffff:1.2.3.4 ?他们不应该是同一个地址吗?

    IPv6表示中是否缺少使这些字符串无效的内容?或者我刚刚在[ipaddress.typarse][1]中发现了一个bug?

    2 回复  |  直到 6 年前
        1
  •  4
  •   glglgl John Dvorak    6 年前

    你写的全行有错误。它应该是8组十六进制数。但是0:0:0:0:0:0:f f f f只有7组-6个0组,1个F组

    事实上,像这样的数字只有6组: 0001:0000:0000:0000:0000:f f f f-1 01组,4 0组,1 F组。

    一个经典的错误就是重复似乎让你忽略了一些东西。

        2
  •  2
  •   fernacolo    6 年前

    我发现了我的错误。问题是,在ipv6表示法中,最后的ipv4采用了两组十六进制数字,我凭直觉认为这只是一组。

    因此,术语如下 0:0:0:0:0:0:0:1.2.3.4 在IPv4之前有7个组,无法解析。但是,术语如下 0:0:0:0:0:0:1.2.3.4 只有6个组的分析结果很好。