鉴于字节数组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,我想你也会得到第二种格式.
精彩评论