2010-04-28 9 views
7

में आईपी एड्रेस स्ट्रिंग को बाइनरी में कनवर्ट करें बड़े एप्लिकेशन के हिस्से के रूप में, मैं एक आईपी एड्रेस बाइनरी में कनवर्ट करने की कोशिश कर रहा हूं। बाद में लैन यातायात पर वेक के प्रसारण पते की गणना करना है। मैं मान रहा हूं कि ऐसा करने का एक और अधिक प्रभावी तरीका है जिस तरह से मैं सोच रहा हूं। जो ऑक्टेट द्वारा आईपी एड्रेस को तोड़ रहा है, जहां आवश्यक हो, प्रत्येक ऑक्टेट की शुरुआत में 0 जोड़ना, प्रत्येक ऑक्टेट को बाइनरी में परिवर्तित करना, फिर परिणामों को जोड़ना। क्या मुझे नेटड्रर, सॉकेट या कुछ पूरी तरह अलग दिखना चाहिए?पाइथन

उदाहरण: 192.168.1.1 से 11000000.10101000.00000001.00000001 को

+0

में आईपी पते को परिवर्तित आप अपने पूर्णांक प्रतिनिधित्व में एक IPv4 पता परिवर्तित करने के लिए देख रहे हैं? या आप किस बाइनरी प्रतिनिधित्व को बदलने की कोशिश कर रहे हैं? – Nate

+1

उदाहरण: 1 9 2.168.1.1 से 11000000.10101000.00000001.00000001 – pizzim13

+0

यह आईपैड्रेस व्यक्त करने का एक बेहद असामान्य तरीका है। मुझे नहीं लगता कि प्रारूप का उत्पादन या उपभोग करने के लिए कोई मॉड्यूल मौजूद है। –

उत्तर

4

आप नीचे की तरह कुछ सोचते हैं?

ip = '192.168.1.1' 
print '.'.join([bin(int(x)+256)[3:] for x in ip.split('.')]) 

मैं दूसरों के साथ सहमत हूं, आपको शायद अपनी इच्छित चीज़ों को प्राप्त करने के लिए बाइनरी प्रतिनिधित्व में परिवर्तित होने से बचना चाहिए।

+0

यही वह है जिसे मैं ढूंढ रहा था लेकिन, मैं पूरी तरह समझ नहीं पा रहा हूं कि यह कैसे काम करता है। मुझे लगता है कि आप आईपी पते को '।' से विभाजित कर रहे हैं, फिर परिणामों को एक 'में शामिल कर रहे हैं।', और एक पूर्णांक से बाइनरी में कनवर्ट करना लेकिन यह: "(x) +256) [3:] x में" पूरी तरह खो गया है। क्या आप सही दिशा में इंगित कर सकते हैं कि आप क्या कर रहे हैं? – pizzim13

+0

@ pizzim13: कोई जादूगर नहीं। आप अच्छी तरह समझ गए कि यह कैसे काम करता है। +256 हमेशा 9 बिट्स बाइनरी नंबर रखने के लिए है, तो संख्या के सामने 0b1 को निकालना आसान है। – kriss

+0

@ pizzim13: और '[... के लिए x में ...]' भाग के लिए ** सूची समझ ** ** पायथन दस्तावेज में देखें। – kriss

7

socket है। inet_aton() आप क्या चाहते हैं?

+3

ऐसा लगता है: 'bin (struct.unpack ('! I', socket.inet_aton ('1 9 2.168.1.1')) [0])' -> '0b11000000101010000000000100000001'' – jfs

3

उद्देश्य बाद में लैन यातायात पर जागो के लिए प्रसारण पते गणना करने के लिए किया जा रहा है

ipaddr (PEP 3144 देखें):

import ipaddr 

print ipaddr.IPNetwork('192.168.1.1/24').broadcast 
# -> 192.168.1.255 

अजगर 3.3, ipaddress module में:

#!/usr/bin/env python3 
import ipaddress 

print(ipaddress.IPv4Network('192.162.1.1/24', strict=False).broadcast_address) 
# -> 192.168.1.255 

परीक्षा से मेल खाने के लिए ई आपके प्रश्न में बिल्कुल:

# convert ip string to a binary number 
print(bin(int(ipaddress.IPv4Address('192.168.1.1')))) 
# -> 0b11000000101010000000000100000001 
1

आप संख्याओं को बाइनरी में बदलने के लिए स्ट्रिंग प्रारूप फ़ंक्शन का उपयोग कर सकते हैं। मैं इस समारोह बना दिया:

def ip2bin(ip): 
    octets = map(int, ip.split('/')[0].split('.')) # '1.2.3.4'=>[1, 2, 3, 4] 
    binary = '{0:08b}{1:08b}{2:08b}{3:08b}'.format(*octets) 
    range = int(ip.split('/')[1]) if '/' in ip else None 
    return binary[:range] if range else binary 

यह एक द्विआधारी आईपी या आईपी रेंज वापस आ जाएगी, ताकि आप इसे उपयोग कर सकते हैं अगर एक आईपी एक श्रेणी में है परीक्षण करने के लिए:

>>> ip2bin('255.255.127.0') 
'11111111111111110111111100000000' 
>>> ip2bin('255.255.127.0/24') 
'111111111111111101111111' 
>>> ip2bin('255.255.127.123').startswith(ip2bin('255.255.127.0/24')) 
True 
1

चर में आईपी पते को परिभाषित करें सूची में

ipadd = "10.10.20.20" 

परिवर्तित आईपी पते

ip = ipadd.split(".") 

अब द्विआधारी संख्या

print ('{0:08b}.{1:08b}.{2:08b}. 
    {3:08b}'.format(int(ip[0]),int(ip[1]),int(ip[2]),int(ip[3]))) 

00001010.00001010.00010100.00010100