运维开发网

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

运维开发网 https://www.qedev.com 2020-06-11 16:10 出处:网络 作者:运维开发网整理
内置.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
内置.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());
在ToString的内部使用 Reflector,您可以看到,如果确定操作系统支持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));

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

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

0

精彩评论

暂无评论...
验证码 换一张
取 消