gpt4 book ai didi

.net - 为什么 IPAddress.MapToIPv4() 会抛出 ArgumentOutOfRangeException?

转载 作者:行者123 更新时间:2023-12-03 23:33:49 28 4
gpt4 key购买 nike

此代码在最后一行抛出 ArgumentOutOfRangeException

var initAddress = IPAddress.Parse("1.65.128.190");
var ipv6Address = initAddress.MapToIPv6();
Assert.IsTrue(ipv6Address.IsIPv4MappedToIPv6);
var ipv4Address = ipv6Address.MapToIPv4();

谁能解释为什么 MapToIPv6() 和 MapToIPv4() 不兼容往返?

编辑:异常源自 IPAddress 构造函数,由 MapToIPv4() 调用。

此外,当第一行是
var initAddress = IPAddress.Parse("1.65.128.90");

不再抛出异常

编辑 2:当@Luaan 转载此内容时,我添加了标签 [bug-reporting]。还添加了 [bcl]。让我们看看是否有任何 MS 人员跟踪这些标签:)

编辑 3:在 Connect https://connect.microsoft.com/VisualStudio/feedback/details/871964 上报告

最佳答案

好的,我实际上已经验证了这一点,所以让我将此作为答案发布。
IPAddress类在将地址映射回 IPv4 时出错。

根据 .NET 引用代码,它执行以下操作:

long address = 
(((m_Numbers[6] & 0x0000FF00) >> 8) | ((m_Numbers[6] & 0x000000FF) << 8)) |
((((m_Numbers[7] & 0x0000FF00) >> 8) | ((m_Numbers[7] & 0x000000FF) << 8)) << 16);

对于在 .NET 中进行按位运算的任何人来说,这个问题应该很明显 - 数字都是 int s。所以转移第二个 ushort ( m_Numbers[7] ) 将给出一个负值,因为最高有效位是 1 .这意味着所有以高于 127 的字节结尾的 IPv4 地址从 IPv6 映射回来时会导致错误。

简单的修复是这样的:
long address = 
(((m_Numbers[6] & 0x0000FF00) >> 8) | ((m_Numbers[6] & 0x000000FF) << 8))
|
(
(uint)(((m_Numbers[7] & 0x0000FF00) >> 8) | ((m_Numbers[7] & 0x000000FF) << 8))
<< 16
);

只需类型转换 intuint在进行位移之前,就可以解决问题。

当您考虑有符号类型时,按位运算可能会非常棘手。我猜代码是从 C++ 库或其他东西复制的,这个问题不会出现。

关于.net - 为什么 IPAddress.MapToIPv4() 会抛出 ArgumentOutOfRangeException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23608829/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com