为什么 .NET 不解析某些带有嵌入式 IPv4 值的 IPv6?
Why .NET does not parse certain IPv6 with embedded IPv4 values?
在我的电脑中,这段代码:
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.TryParse][1] 中发现了错误?
你写的全行有误。它应该是8组十六进制数。 0:0:0:0:0:0:ffff 然而只有 7 个组 - 6 个 0 组,1 个 f 组
确实像这样的数字只有 6 组:
0001:0000:0000:0000:0000:ffff - 1 个 01 组,4 个 0 组,1 个 f 组。
只是一个典型的错误,重复似乎让你忽略了一些东西。
我发现了我的错误。问题是IPv4最后在IPv6表示法中取了2组十六进制数字,我直觉以为只是一组。
因此,像 0:0:0:0:0:0:0:1.2.3.4
这样在 IPv4 之前有 7 组的术语将无法解析。但是,像 0:0:0:0:0:0:1.2.3.4
这样的术语,只有 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.TryParse][1] 中发现了错误?
你写的全行有误。它应该是8组十六进制数。 0:0:0:0:0:0:ffff 然而只有 7 个组 - 6 个 0 组,1 个 f 组
确实像这样的数字只有 6 组: 0001:0000:0000:0000:0000:ffff - 1 个 01 组,4 个 0 组,1 个 f 组。
只是一个典型的错误,重复似乎让你忽略了一些东西。
我发现了我的错误。问题是IPv4最后在IPv6表示法中取了2组十六进制数字,我直觉以为只是一组。
因此,像 0:0:0:0:0:0:0:1.2.3.4
这样在 IPv4 之前有 7 组的术语将无法解析。但是,像 0:0:0:0:0:0:1.2.3.4
这样的术语,只有 6 个组就可以很好地解析。