开发者

Convert IP address string to binary in Python

开发者 https://www.devze.com 2022-12-29 01:39 出处:网络
As part of a larger application, I am trying to convert an IP address to binary. Purpose being to later calculate the broadcast address for Wake on LAN traffic. I am assuming that there is a much more

As part of a larger application, I am trying to convert an IP address to binary. Purpose being to later calculate the broadcast address for Wake on LAN traffic. I am assuming that there is a much more efficient way to do this then the way I am thinking. Which is breaking up the IP address by octet, adding 0's to the beginning of each octet where necessary, converting each octet to binary, then combining the results. Should I be looking at netaddr, sockets, or something com开发者_开发问答pletely different?

Example: From 192.168.1.1 to 11000000.10101000.00000001.00000001


You think of something like below ?

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

I agree with others, you probably should avoid to convert to binary representation to achieve what you want.


Is socket.inet_aton() what you want?


Purpose being to later calculate the broadcast address for Wake on LAN traffic

ipaddr (see PEP 3144):

import ipaddr

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

In Python 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

To match the example in your question exactly:

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


You can use string format function to convert the numbers to binary. I made this function:

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

This will return a binary IP or IP range, so you can use it to test if an IP is in a range:

>>> 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


Define IP address in variable

ipadd = "10.10.20.20"

convert IP address in list

ip = ipadd.split(".")

Now convert IP address in binary numbers

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


IP = '192.168.1.1'

ip2bin =  ".".join(map(str,["{0:08b}".format(int(x)) for x in IP.split(".")]))
print(ip2bin)

output

11000000.10101000.00000001.00000001


Should I be looking at netaddr, sockets, or something completely different?

For anyone asking in the present day, you should use netaddr if you want to do anything not supported in the Python 3.3+ built-in ipaddress module. Here is how you would do what you wanted to with netaddr, as an example:

>>> from netaddr import IPAddress
>>> ip = IPAddress('192.168.1.1')
>>> print(ip.bits())
11000000.10101000.00000001.00000001


ip = '192.168.1.1'

k=[" "]

for x in ip.split("."):

   a=(bin(int(x))[2:])
   k.append(a)    

print(".".join(list(k))[2:])

0

精彩评论

暂无评论...
验证码 换一张
取 消