【问题标题】:IP Address to Number differ in Javascript and c#.netJavascript和c#.net中的IP地址到数字不同
【发布时间】:2013-02-11 11:09:15
【问题描述】:

我需要应用 IP 地址的范围验证,为此我使用了 http://www.allredroster.com/iptodec.htm

http://javascript.about.com/library/blipconvert.htm

    //JAVASCRIPT CODE
    function dot2num(dot) {
        var d = dot.split('.');
        return ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]);
    }

    //C# CODE SERVER SIDE
    System.Net.IPAddress ipAdd;
    if (System.Net.IPAddress.TryParse(ipAddress, out ipAdd))
        return ipAdd.Address;

但是,在客户端返回的值与我在服务器端使用 IPAddress 类得到的完全不同。

【问题讨论】:

  • 它们是完全不同的方法,IP to Decimal 将 IP 地址转换为十进制,而 .Net 方法 System.Net.IPAddress.TryParse 如果它是有效的 IPAddress,则返回 true。
  • 您的 C# 代码似乎正在访问并返回一个名为 Address 的 IPAddress 的过时属性。
  • @jeremy 你错过了out 参数。
  • @JeremyThompson 是的,我正在使用 IPAddress.Address 属性来访问 ipaddress 字符串的长值。
  • 可能是字节序问题。

标签: c# javascript ip-address


【解决方案1】:

使用下面的 Javascript 函数怎么样?

function num2dot(num) {
    var d = num%256;
    for (var i = 3; i > 0; i--) {
        num = Math.floor(num/256);
        d = num%256 + '.' + d;
    }
    return d;
}

如果您对哪个函数返回正确的值有疑问,可以在http://www.ipaddressguide.com/ip 中输入IP 地址并进行验证。

如果您需要进一步的帮助,请告诉我。

【讨论】:

  • fyi,代码已解析,js函数已经正常工作了。
【解决方案2】:

我会阅读 http://social.msdn.microsoft.com/Forums/en/netfxnetcom/thread/9d568a3e-9fbf-4acb-92fc-ff629cd8653f 关于该主题的内容。如果输入不是很具体,System.Net.IPAddress.TryParse 可能会抛出一些奇怪的结果

【讨论】:

    【解决方案3】:

    最后,我在服务器端做了同样的事情,因为 IPAddress.Address 没有返回正确的结果,我不知道为什么,但是谁能告诉我为什么会这样?

    //WORKING CODE NOW
    
    //JAVASCRIPT CODE
    function dot2num(dot) {
        var d = dot.split('.');
        return ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]);
    }
    
    //C# CODE SERVER SIDE
    function dot2num(dot)
    {
       var ip = IPAddress.Parse(args.Value);
       var ipBytes = ip.GetAddressBytes();
       double ipAddress = ipBytes[0] * Math.Pow(256, 3) + ipBytes[1] * Math.Pow(256, 2) + ipBytes[2] * Math.Pow(256, 1) + ipBytes[3];
       return ipAddress;   
    }
    

    【讨论】:

    • 仅供参考,您可以使用左移来执行与 math.pow 相同的操作。
    • 当您应该在代码中将 4 个字节打包到常规 System.Int32 (int) 中时,您将返回一个双精度。由于浮点不精确,这可能会影响打包字节。
    猜你喜欢
    • 2013-07-02
    • 2010-12-13
    • 1970-01-01
    • 2011-01-04
    • 2010-09-27
    • 2015-02-16
    • 1970-01-01
    • 2021-01-03
    • 2017-08-29
    相关资源
    最近更新 更多