2012-04-23 17 views
5

संभव डुप्लिकेट:
IP Address to Integer - Cरूपांतरण पूर्णांक

मैं एक आईपी पता कैसे परिवर्तित जो निम्नलिखित रूप है पूर्णांक: ए.बी. या एबीसी * या ए । * या मैं एक सी प्रोग्राम लिखना चाहता हूं जो यह निर्धारित कर सकता है कि कोई आईपी पता दूसरे का सबसेट है या नहीं। उदाहरण के लिए आईपी पता 192.168.125.5 1 9 2.168 का उप-समूह है। । अब मैं दोनों आईपी पतों को अद्वितीय पूर्णांक में परिवर्तित करना चाहता हूं और बाद में जांच करता हूं कि कोई दूसरे का उप-समूह है या नहीं। क्या इसको हासिल करने के लिए कोई रास्ता है?

+0

आप नहीं करते आईपी ​​पते को पूर्णांक में कनवर्ट करना चाहते हैं। एक शुरुआत के लिए जो केवल आईपीवी 4 के साथ काम करता है। आप उन्हें उचित लंबाई के बाइट एरे में परिवर्तित करना चाहते हैं और फिर उन पर नेटमास्क ऑपरेशन करना चाहते हैं। – EJP

+0

यदि आपके प्लेटफ़ॉर्म में है तो 'inet_pton() 'का उपयोग करें। – Jasen

उत्तर

7

एक आईपी पता, उदा। 1 9 2.168.0.1 को हेक्स में लिखकर आसानी से एक पूर्णांक के रूप में लिखा जा सकता है जो 0xC0 0xA8 0x00 0x01 या 0xC0A80001

फिर यह थोड़ा मिलान करने का मामला है, इसलिए आप एक संबंधित सबनेट मास्क, 255.255.0.0 बनाते हैं बस 0xFFFF0000 और आपको लगता है कि दोनों मैच से कर परीक्षण कर सकते हैं:

0xC0A80001 & 0xFFFF0000 == 0xC0A80000 & 0xFFFF0000 

जहां समानता परीक्षण के एक तरफ, "आधार महत्वपूर्ण चीज़ों" और दूसरी तरफ एक असली पता है किसी दिए गए मुखौटा होने के साथ दोनों तरफ से वही।

सामान्य तौर पर आप '*' चीजें हैं जो कर रहे हैं की स्थापना होने की द्वारा एक उपयुक्त मुखौटा निर्माण कर सकते हैं 0 और चीजें हैं जो वास्तविक संख्या हैं 0xFF होने के लिए, यदि आप महीन अनाज मास्क चाहते हैं कि उसे '*' के साथ व्यक्त करने के लिए मुश्किल है।

1

आसान और गैर सामान्य तरीके से sscanf उपयोग करने के लिए है (पूर्णांक एक, ख, ग के साथ, घ): sscanf(ip, "%d.%d.%d.%d", &a, &b, &c, &d); लेकिन यह काम करता है केवल यदि आप सभी वर्गों के साथ साथ आईपी है: 10.47.100.1

यदि यह मामला नहीं है, तो भी आप sscanf के लौटे हुए मान का उपयोग कर सकते हैं, जो आपको बताएगा कि यह कितने मिलान करने के लिए सफल हुआ (या ईओएफ)।

4 नंबरों के बाद आप सबसेट रिलेशनशिप की जांच कर सकते हैं।

+0

नहीं, मैं आईपी पते को पूर्णांक में कनवर्ट करना चाहता हूं और फिर सबसेट रिलेशनशिप के लिए जांचना चाहता हूं .... – mmuttam

+0

आप अभी भी 4 प्राप्त हुए एक से एक पूर्णांक बना सकते हैं। मुश्किल हिस्सा पूर्णांक को पार्स करना है। बाद में, आप उन्हें बाएं स्थानांतरित कर सकते हैं, जैसा कि अन्य ने यहां सुझाव दिया है। –

0

एक एकल पूर्णांक (32-बिट मानते हुए) आपके द्वारा रेखांकित किए जाने वाले प्रतिनिधित्व के लिए पर्याप्त नहीं है। तारों को व्यक्त करने में सक्षम होने के लिए आपको अधिक जानकारी चाहिए।

उदाहरण के लिए, आपके पास एक (जोड़ी, नेटमास्क) की एक जोड़ी हो सकती है, जहां नेटमास्क या तो एक छोटा छोटा पूर्णांक है जो वैध उच्च-ऑर्डर बिट्स की संख्या का प्रतिनिधित्व करता है, उदाहरण के लिए एक नेटवर्क पता जैसे कि "10.0। 0.0 "जोड़ी द्वारा प्रदर्शित किया जा सकता है (0x0a000000, 8)। यदि आप वास्तव में कुछ कारणों से पते में "कहीं भी" वाइल्डकार्ड प्राप्त करने में सक्षम होना चाहते हैं, तो आपको प्रति पता बिट में एक फ्लैग बिट का पूरा सेट चाहिए, इसलिए दो 32-बिट पूर्णांक। फिर आप जोड़ी (0xc0a80000, 0xffff0000) के रूप में "1 9 2.168। " "का प्रतिनिधित्व कर सकते हैं।

12

आप क्या चाहते हैं यह निर्धारित करना है कि एक आईपी पता एक सबनेट में है, और ऐसा करने के लिए आप नेटमास्क लागू करना चाहते हैं। आप जो चाहते हैं उसे करने के लिए शायद (निश्चित रूप से) पुस्तकालय पहले से ही बाहर हैं। यह है कि आप अपना खुद का रोल करना चाहते हैं।

इस आईपी पते एक विश्वसनीय स्रोत (यानी, नहीं एक उपयोगकर्ता) से आता है, तो आप बस एक मानक सी-स्ट्रिंग से आईपी पते की तरह कुछ कर रही द्वारा निकाल सकते हैं:

char ipAddressString[16] = "192.168.125.5" 
char netMaskString[16] = "255.255.0.0" 
char subnetString[16] = "192.168.0.0" 

uint32_t ipAddress = parseIPV4string(ipAddressString); 
uint32_t netmask = parseIPV4string(netmaskString); 
uint32_t subnet = parseIPV4string(subnetString); 

if (ipAddress & netmask == subnet) { 
    return true; 
} 

uint32_t parseIPV4string(char* ipAddress) { 
    char ipbytes[4]; 
    sscanf(ipAddress, "%uhh.%uhh.%uhh.%uhh", &ipbytes[3], &ipbytes[2], &ipbytes[1], &ipbytes[0]); 
    return ipbytes[0] | ipbytes[1] << 8 | ipbytes[2] << 16 | ipbytes[3] << 24; 
} 
+0

अच्छा, उस पार्सर तर्क के लिए भी धन्यवाद! –

+1

एक int (% d) को एक char (ipbytes [x]) में पॉइंटर को गंभीर त्रुटियों का कारण बनता है क्योंकि sscanf ipbytes [x] द्वारा दिये गये स्मृति में आकार (int) बाइट लिखता है। यह उदाहरण बहुत खतरनाक है। – Zac

+2

@Zac कितना शर्मनाक है! मैंने त्रुटि तय की है। – OmnipotentEntity

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