【问题标题】:How to parse ipv6 address into "octets"?如何将 ipv6 地址解析为“八位字节”?
【发布时间】:2014-01-09 17:59:52
【问题描述】:

我希望能够将 ipv6 地址解析为八位字节。有没有类似下面的?

IPAddress.Parse(address).GetAddressBytes()[0];
IPAddress.Parse(address).GetAddressBytes()[1];

【问题讨论】:

  • @L.B GetAddressBytes() 已经返回一个数组。
  • GetAddressBytes() 也适用于 IPv6 地址...或者这不是您的意思?
  • 如果我有一个 ipv4 地址:1.2.3.4,GetAddressBytes()[0] 将返回 1。如果我有一个 ipv6 地址:2001::1:2:3:4,GetAddressBytes ()[0] 将返回 32。如何获得 2001?
  • 2001 无法容纳八位字节。
  • @amirm:我觉得你有点困惑。请参阅下面的修改后的答案。

标签: c# ipv6


【解决方案1】:

你的意思是这样的?

IPAddress ipv6Addr = IPAddress.Parse("FE80::0202:B3FF:FE1E:8329") ;
byte[]    octets   = ipv6Addr.GetAddressBytes() ;

string text = String.Join( "," , octets.Select( x => string.Format("0x{0:X2}", x ) ) ) ;
Console.WriteLine(text);

上面的 sn -p 将这个写入控制台:

0xFE,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0xB3,0xFF,0xFE,0x1E,0x83,0x29

如你所料。

编辑注释:您可能想了解 IPv6 地址如何表示为文本

IPv4 地址是一个 32 位整数(4 个八位字节),在文本中使用“点四边形”表示法表示:x.x.x.x,其中每个“x”是相关八位字节的十进制值。

IPv6 地址为 128 位(长度为 16 个八位字节)。规范的文本表示为 8 个 16 位整数,以十六进制形式显示,用冒号分隔:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx,尽管有许多方法可以操作它以使表示更紧凑。

要从评论中获得您想要的内容,您需要获取您获得的 16 个八位字节的数组,并将每对八位字节转换为 ushort

您应该注意,文本表示是 网络字节顺序 中的 IP 地址(大端,唯一正确的架构,恕我直言)。英特尔芯片是小端的。你需要考虑到这一点。更多关于字节序和网络字节顺序的信息:http://en.wikipedia.org/wiki/Endianness

【讨论】:

  • 十六进制八位字节是一个不好的例子 - 每个人都使用 base-10,包括 RFC。这是一个使用 IPv6 八位字节的 TLS 证书,例如:https://[2606:4700:4700::1111]/(加载页面并查看证书以查看它们)。最好向他解释一下“2001”中的“20”表示 0x20,这也是他在 GetAddressBytes()[0] 数组中看到的数字 32(以 10 为底)...
猜你喜欢
  • 2017-01-13
  • 1970-01-01
  • 2019-09-18
  • 2013-07-02
  • 2017-11-05
  • 1970-01-01
  • 2012-12-25
  • 2011-12-10
  • 2011-06-15
相关资源
最近更新 更多