【问题标题】:equivalent of INET_ATON() in mongodb相当于 mongodb 中的 INET_ATON()
【发布时间】:2013-04-13 12:22:11
【问题描述】:

mongodb 中的 INET_ATON() 等价物是什么?我正在将 nodejs 与 mongodb 一起使用,所以如果 nodejs 中的等价物可用,那就足够了。

【问题讨论】:

  • 您可能还需要考虑 IPv6 支持:inet_pton
  • 对于nodejs,看起来你可以使用这个模块。 npmjs.com/package/inet

标签: node.js mongodb


【解决方案1】:
// ip example: 192.168.2.1
function inet_aton(ip){
    // split into octets
    var a = ip.split('.');
    var buffer = new ArrayBuffer(4);
    var dv = new DataView(buffer);
    for(var i = 0; i < 4; i++){
        dv.setUint8(i, a[i]);
    }
    return(dv.getUint32(0));
}

// num example: 3232236033
function inet_ntoa(num){
    var nbuffer = new ArrayBuffer(4);
    var ndv = new DataView(nbuffer);
    ndv.setUint32(0, num);

    var a = new Array();
    for(var i = 0; i < 4; i++){
        a[i] = ndv.getUint8(i);
    }
    return a.join('.');
}

http://rolfrost.de/ipjs.html

【讨论】:

    【解决方案2】:

    这是别人将 IP 地址从点分十进制字符串转换为 32 位数字的解决方案:

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

    从这里:IP-addresses stored as int results in overflow?

    【讨论】:

      【解决方案3】:
      function inet_aton(ip){
          var a = new Array();
          a = ip.split('.');
          return((a[0] << 24) >>> 0)  + ((a[1] << 16) >>> 0) + ((a[2] << 8) >>> 0) + (a[3] >>> 0);
      }
      
      function inet_ntoa(n){
          var a = ((n >> 24) & 0xFF) >>> 0;
          var b = ((n >> 16) & 0xFF) >>> 0;
          var c = ((n >> 8) & 0xFF) >>> 0;
          var d = (n & 0xFF) >>> 0;
          return(a + "." + b + "." + c + "." + d);
      }
      

      我的网站见下文/上文,与旧版浏览器兼容。

      【讨论】:

        【解决方案4】:

        这是 Javascript 中使用类型化数组的 ntoa 函数的一个版本。

        function ntoa(ipInt) {
          var buffer = new ArrayBuffer(4);
          var uint8View = new Uint8Array(buffer);
          var uint32View = new Uint32Array(buffer);
          uint32View[0] = ipInt;
          var ipSegments = [];
          for (var i = 0; i < uint8View.length; i ++) {
            ipSegments.push(uint8View[i]);
          }
          return ipSegments.join(".");
        } 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-04
          • 2014-03-19
          • 2020-02-13
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          • 1970-01-01
          • 2011-07-11
          相关资源
          最近更新 更多