pizzim13
pizzim13

Reputation: 1482

Convert IP address string to binary in Python

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 completely different?

Example: From 192.168.1.1 to 11000000.10101000.00000001.00000001

Upvotes: 16

Views: 39624

Answers (8)

Eron Lloyd
Eron Lloyd

Reputation: 398

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

Upvotes: 1

Mythily Thangavelu
Mythily Thangavelu

Reputation: 1

ip = '192.168.1.1'

k=[" "]

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

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

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

Upvotes: 0

Ahmed
Ahmed

Reputation: 464

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

Upvotes: 1

Devendra Singh
Devendra Singh

Reputation: 136

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

Upvotes: 1

Danilo
Danilo

Reputation: 31

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

Upvotes: 3

jfs
jfs

Reputation: 414179

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

Upvotes: 9

kriss
kriss

Reputation: 24177

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.

Upvotes: 9

EMP
EMP

Reputation: 61971

Is socket.inet_aton() what you want?

Upvotes: 9

Related Questions