【问题标题】:System.Net.IPAddress.Parse() converts (unwanted) IPv6 string to IPv4-mapped-to-IPv6-addressSystem.Net.IPAddress.Parse() 将(不需要的)IPv6 字符串转换为 IPv4 映射到 IPv6 地址
【发布时间】:2021-11-01 13:38:10
【问题描述】:

我正在尝试将 IP 地址字符串解析为 System.Net.IPAddress。

var ip = IPAddress.Parse(iPAddressDefinition);

字符串可以是每个 IPv4 或每个 IPv6 地址,即 0.0.0.0 - 255.255.255.255 和 :: - ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff。解析在 99% 的时间内按预期工作。

但是,如果第三个(从右边开始)八位字节是 ffff,例如::ffff:0808:0808,Parse() 函数将字符串解释为 IPv4 映射到 IPv6 地址,导致后面的代码出错。

上面示例的结果是 ::ffff.8.8.8.8,但 ::ffff:808:808 或 ::ffff:0808:0808 是我希望收到的。

是否有一种简单、无错误的内置函数来实现这一点,还是我必须编写一个字符串操作函数?

编辑:在阅读了有用的 cmets 之后,我意识到这不是 .Parse() -Problem 而是 .toString() -Problem

我找到了适合我的解决方案。如果您找到更好的解决方案,请告诉我!

【问题讨论】:

  • 我很想知道您认为一旦字符串被解析为 IPAddress 的区别。为什么要担心强制转换回字符串会发生什么?
  • 根据rfc4291 2.5.5.2. IPv4-Mapped IPv6 Address,它被正确解释为 IPv4 映射到 IPv6 地址。
  • 好问题。我需要用于 HTTP 的 System.Net.IPAddress 对象 - 功能(不相关)。在代码的另一部分,我只能访问 IPAddress。我需要将其转换为十六进制字符串以进行比较和数据库存储。这是代码出错的部分,因为 IPAddress.ToString() 返回到 IPv4 映射的 IPv6 格式

标签: c# ip-address


【解决方案1】:

在阅读了有用的 cmets 之后,我意识到这不是 .Parse() - 问题,而是 .toString() - 问题。

                var ip = IPAddress.Parse(iPAddressDefinition);
                if (ip.IsIPv4MappedToIPv6)
                {
                    var index = iPAddressDefinition.IndexOf("ffff");
                    strIp = string.Concat("::", iPAddressDefinition[index..]);
                }
                else
                {
                    strIp = ip.ToString();
                }

如果您找到更好的解决方案,请告诉我!

【讨论】:

    猜你喜欢
    • 2012-06-29
    • 2013-09-18
    • 1970-01-01
    • 2011-02-16
    • 2012-12-25
    • 2012-04-11
    • 2018-01-23
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多