是什么规定了System.Net.IPAddress.ToString()的IPv6地址格式?

Ed *_*per 5 .net ip-address ipv6

内置.Net方法System.Net.IPAddress.ToString()对IPv6地址的行为不一致.

给定字节数组0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,在某些环境"aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa"中返回,而其他环境返回"aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:172.172.172.172".

我知道两者都是有效的IPv6格式,但我希望能够解释其中的差异.

似乎较新的环境(Windows 7和Server 2008 R2)更有可能产生第一个行为,所以我检查了明显的差异,如.Net框架版本,但我一直无法检测到模式.

有没有办法可以选择一种格式而不是另一种格式,或者我是否需要围绕此格式进行编码才能获得一致的行为?

要重新创建的代码:

    byte[] bytes = {0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA};
    IPAddress myIP = new IPAddress(bytes);
    Console.WriteLine(myIP.ToString());
Run Code Online (Sandbox Code Playgroud)

Dam*_*ver 5

使用Reflector在ToString的内部进行探测,您可以看到,如果确定操作系统支持IPv6(对于某些支持值),则它会推迟到名为WSAAddressToString的Win32函数,而如果未设置此标志,它手动格式化(从它的内部字节数组):

addressString.Append(string.Format(CultureInfo.InvariantCulture, "{0:x4}", new object[] { this.m_Numbers[0] })).Append(':');
addressString.Append(string.Format(CultureInfo.InvariantCulture, "{0:x4}", new object[] { this.m_Numbers[1] })).Append(':');
addressString.Append(string.Format(CultureInfo.InvariantCulture, "{0:x4}", new object[] { this.m_Numbers[2] })).Append(':');
addressString.Append(string.Format(CultureInfo.InvariantCulture, "{0:x4}", new object[] { this.m_Numbers[3] })).Append(':');
addressString.Append(string.Format(CultureInfo.InvariantCulture, "{0:x4}", new object[] { this.m_Numbers[4] })).Append(':');
addressString.Append(string.Format(CultureInfo.InvariantCulture, "{0:x4}", new object[] { this.m_Numbers[5] })).Append(':');
addressString.Append((int) ((this.m_Numbers[6] >> 8) & 0xff)).Append('.');
addressString.Append((int) (this.m_Numbers[6] & 0xff)).Append('.');
addressString.Append((int) ((this.m_Numbers[7] >> 8) & 0xff)).Append('.');
addressString.Append((int) (this.m_Numbers[7] & 0xff));
Run Code Online (Sandbox Code Playgroud)

它将始终返回您显示的第二种格式.

是否设置标志"OS支持IPv6"标志似乎取决于类中的内部知识(版本必须> 2000)并且它似乎是创建IPv6套接字的实际尝试 - 因此如果您在具有IPv6的XP机器上禁用,我想你也会得到第二种格式.