【问题标题】:Are there any .NET Framework Method that does INET_ATON()是否有任何执行 INET_ATON() 的 .NET Framework 方法
【发布时间】:2012-12-09 11:42:51
【问题描述】:

下面是这样计算的

address = '174.36.207.186'

( o1, o2, o3, o4 ) = address.split('.')

integer_ip =   ( 16777216 * o1 )
             + (    65536 * o2 )
             + (      256 * o3 )
             +              o4

【问题讨论】:

  • here
  • 我检查了这两个地方,但没有找到可行的解决方案。首先它必须是 int 64 而不是 32
  • Int32 不支持大于127.255.255.255 的地址;但是,UInt32 将支持完整的 IPv4 范围。 Int64 太过分了。
  • 我认为@Douglas 的解决方案比重复的信号要好得多。请让这个问题及其答案公开

标签: c# inet-aton


【解决方案1】:
string s = "174.36.207.186";

uint i = s.Split('.')
          .Select(uint.Parse)
          .Aggregate((a, b) => a * 256 + b);

【讨论】:

    【解决方案2】:

    您可以将数字解析成字节数组,然后使用BitConverter.ToInt32 将它们组合成一个int:

    byte[] parts = address.Split('.').Select(Byte.Parse).ToArray();
    if (BitConverter.IsLittleEndian) {
      Array.Reverse(parts);
    }
    int ip = BitConverter.ToInt32(parts, 0);
    

    【讨论】:

    • Int32 仅支持最多127.255.255.255 的地址。
    • @Douglas:一点也不。高于该值的地址表示为负 int 值。如果您更喜欢,可以将 int 转换为 uint
    • 公平点。我应该说负数的意图不太清楚。例如,任何假设的排序都会被破坏; 127.0.0.0 < 128.0.0.0 将使用 Int32 表示评估为 false。
    【解决方案3】:

    您可以将字符串解析为 IPAddress 实例,然后访问Address Property

    long result = IPAddress.Parse("174.36.207.186").Address;
    

    请注意,这将产生编译器警告(过时属性),因为它不适用于 IPv6。

    【讨论】:

    • 不返回相同的值,例如 ip:1.0.145.221 返回:3717267457 而它应该返回:16814557
    • 也许你需要NetworkToHostOrder
    • 怎么用?我尝试了几种组合,但不接受 ip 作为参数
    猜你喜欢
    • 1970-01-01
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-07-12
    • 2011-06-16
    相关资源
    最近更新 更多