2011-12-05 2 views
6

कॉफीस्क्रिप्ट में मैं एक आईपी (मानक आईपीवी 4 127.0.0.1) को एक पूर्णांक में बदलने के बारे में कैसे जाउंगा?कॉफ़ीस्क्रिप्ट का उपयोग कर आईपीवी 4 को इंटीजर में कैसे परिवर्तित करें?

संपादित करें: यहां बहुत सारे महान उत्तर हैं, सभी को धन्यवाद!

+0

@RussellDias अरे ... कि बहुत उपयोगी नहीं (संकेत: '127.0.0.1' का दशमलव पूर्णांक प्रतिनिधित्व 127001 नहीं है)। –

+0

@ कहीं भी मुझे लगता है कि मैंने प्रश्न को गलत समझा है :) –

उत्तर

3

संपादित करें: Coffeescript

ipStringToInteger = (x) -> 
    res = 0 
    (res = res * 256 + Number(y) for y in x.split(".")) 
    res 

जो

करने के लिए नीचे संकलित
var ipStringToInteger; 
ipStringToInteger = function(x) { 
    var res, y, _i, _len, _ref; 
    res = 0; 
    _ref = x.split("."); 
    for (_i = 0, _len = _ref.length; _i < _len; _i++) { 
    y = _ref[_i]; 
    res = res * 256 + Number(y); 
    } 
    return res; 
}; 

एक छोटी शुद्ध Javascript क्रियान्वयन

var ipV4StringToInteger = function(string) { 
    var parts = string.split("."); 

    var sum = 0; 

    for(var i = 0; i < 4; i++) { 
    var partVal = Number(parts[i]); 
    sum = (sum << 8) + partVal; 
    } 

    return sum; 
}; 

है एक अच्छा शुद्ध जावास्क्रिप्ट कार्यान्वयन है

var ipV4StringToInteger = function(string) { 
    var parts = string.split("."); 
    if(parts.length != 4) 
    throw new Error("IPv4 string does not have 4 parts."); 

    var sum = 0; 

    for(var i = 0; i < 4; i++) { 

    var part = parts[i]; 
    if(!part.match("^\\d+$")) 
     throw new Error("Non-digit, non-period character in IPv4 string."); 

    var partVal = Number(part); 
    if(partVal > 255) 
     throw new Error("IPv4 string contains invalid value."); 

    sum = (sum << 8) + partVal; 
    } 

    return sum; 
}; 
+1

मैं जमा करने के लिए 'मानचित्र' का उपयोग करने का बड़ा प्रशंसक नहीं हूं। मैपिंग मान मानते हैं कि कोई पक्ष प्रभावित नहीं होता है लेकिन आप फ़ंक्शन के भीतर जमा करके एक बना रहे हैं। यदि आप इस तरह के दृष्टिकोण का उपयोग करने जा रहे हैं, तो कम से कम 'कम करें' पर विचार करें जिसका उद्देश्य एक सेट के संचय (एकत्रीकरण) को प्रबंधित करना है। फिर भी, सभी ब्राउज़रों में न तो 'नक्शा' और न ही 'कम करें' समर्थित हैं (जावास्क्रिप्ट 1.6 की आवश्यकता है)। उस बिंदु पर, आप बस लूप आईएमओ भी कर सकते हैं। –

+0

मैं मानता हूं कि 'map' का उपयोग गंदा है। मैं पूरी तरह से सहमत हूं कि लूप पूर्ण संगतता के लिए सही कदम है।'Array.map' और' Array.reduce 'के लिए एमडीएन को देखते हुए दिखाता है कि' कम करें 'जावास्क्रिप्ट 1.8 है और' मानचित्र' 1.6 है; दोनों IE में अनुपलब्ध हैं <= 8 लेकिन पुराने मानचित्र एफएफ़, ओपेरा और सफारी में 'map' उपलब्ध है ... – ellisbben

+0

हाँ, मुझे याद आया। मैंने सोचा था कि कम से कम 1.6 का हिस्सा था ... मुझे गलत मत समझो, मुझे नक्शा/कम/फ़िल्टर/आदि पसंद है ... लेकिन मैं उन में से किसी पर भरोसा नहीं करता हूं और यह सुनिश्चित करने के लिए अंडरस्कोर की तरह कुछ लाता हूं मेरे पास क्षमताएं हैं ... लेकिन अगर मैं इस तरह के एक फ़ंक्शन को लागू कर रहा हूं (कच्चा), तो मैं बस एक लूप पसंद करूंगा। विशेष रूप से कॉफीस्क्रिप्ट वाक्यविन्यास बहुत साफ है :) –

1

मेरा मानना ​​है कि @ellisbben ने इसे मारा, लेकिन सोचा कि मैं थोड़ा और त्रुटि जांच के साथ एक और जेएस संस्करण पर होगा।

function ip2int(ip){ 
    // split them in to their own numbers 
    var octets = ip.split('.'); 

    // make sure we have a valid IP. (length-wise) 
    if (octets.length!=4) return false; 

    // begin parsing 
    var result = 0; 
    for (var v = 1; v <= 4; v++){ 
     var i = parseInt(octets[v-1],10); 

     // valid number? 
     if (isNaN(i) || i < 0 || i > 255) return false; 

     result += (i * Math.pow(256,(4-v))); 
    } 
    return result; 
} 

alert(ip2int('127.0.0.1')); 
2

मैं थोड़ा बदलने दृष्टिकोण ले लेंगे:

ip_to_int = (value) -> 
    result = 0 

    for part, i in value.split "." 
    result |= part << (3-i) * 8 

    result 

इसका इस्तेमाल करने के लिए सरल है:

alert ip_to_int "127.0.0.1" 
2

पूर्णांक आप सूत्र की जरूरत है एक आईपी बदलने के लिए

(first octet * 256³) + (second octet * 256²) + (third octet * 256) + (fourth octet) 

ip = '127.0.0.1' चलो, वह आत्मा के रूप में लिखा d जा:

integer = 0 
for octet, i in ip.split('.') 
    integer += octet * Math.pow 256, 3-i 

और यह reduce पद्धति का उपयोग करके सरल किया जा सकता:

integer = ip.split('.').reduce ((t, n) -> t*256 + parseInt n), 0 
-1

Node.js के लिए छोटी से छोटी समाधान:

function ip2int(ip) { 
    var ipint = 0; 
    ip.split('.').map(function (e, i) { 
     ipint += Math.pow(256, 3-i) * e; 
    }); 
    return ipint; 
} 
console.log(ip2int('10.1.1.20')); 
0

यहाँ एक और थोड़ा बदलाव विधि है।

addr='192.168.5.253'.split('.'); 
ipInt = (+addr[0] << 24) + (+addr[1] << 16) + (+addr[2] << 8) + (+addr[3]); 

और यह उल्टा करने के लिए ...

[ipInt >> 24 & 0xff,ipInt >> 16 & 0xff,ipInt >> 8 & 0xff,ipInt & 0xff].join('.'); 
0

क्षमा करें, यह जे एस संस्करण है, लेकिन यह यह CoffeeScript में तब्दील करने के लिए बहुत आसान है:

// 'x.x.x.x' -> number  
function Ip4ToInt(ip4str) { 

    var addr = ip4str.split('.'); 
    if (addr.length !== 4 || addr.some((elm) => (parseInt(elm) > 255 || parseInt(elm) < 0))) { 
     throw new Error('Invalid ip4 string: ' + ip4str); 
    } 
    return ((addr[0] << 24) >>> 0) + ((addr[1] << 16) >>> 0) + ((addr[2] << 8) >>> 0) + (addr[3]); 
} 

// number -> 'x.x.x.x' 
function IntToIp4(ip4int){ 
    return [ip4int >> 24 & 0xff,ip4int >> 16 & 0xff,ip4int >> 8 & 0xff,ip4int & 0xff].join('.'); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे