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)
使用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机器上禁用,我想你也会得到第二种格式.
| 归档时间: |
|
| 查看次数: |
1048 次 |
| 最近记录: |