# Convert binary to ASCII and vice versa

### Question

Using this code to take a string and convert it to binary:

``````bin(reduce(lambda x, y: 256*x+y, (ord(c) for c in 'hello'), 0))
``````

this outputs:

``````0b110100001100101011011000110110001101111
``````

Which, if I put it into this site (on the right hand site) I get my message of `hello` back. I'm wondering what method it uses. I know I could splice apart the string of binary into 8's and then match it to the corresponding value to `bin(ord(character))` or some other way. Really looking for something simpler.

1
69
5/23/2017 3:00:13 PM

For ASCII characters in the range `[ -~]` on Python 2:

``````>>> import binascii
>>> bin(int(binascii.hexlify('hello'), 16))
'0b110100001100101011011000110110001101111'
``````

In reverse:

``````>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> binascii.unhexlify('%x' % n)
'hello'
``````

In Python 3.2+:

``````>>> bin(int.from_bytes('hello'.encode(), 'big'))
'0b110100001100101011011000110110001101111'
``````

In reverse:

``````>>> n = int('0b110100001100101011011000110110001101111', 2)
>>> n.to_bytes((n.bit_length() + 7) // 8, 'big').decode()
'hello'
``````

### To support all Unicode characters in Python 3:

``````def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
bits = bin(int.from_bytes(text.encode(encoding, errors), 'big'))[2:]
return bits.zfill(8 * ((len(bits) + 7) // 8))

def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
n = int(bits, 2)
return n.to_bytes((n.bit_length() + 7) // 8, 'big').decode(encoding, errors) or '\0'
``````

### Here's single-source Python 2/3 compatible version:

``````import binascii

def text_to_bits(text, encoding='utf-8', errors='surrogatepass'):
bits = bin(int(binascii.hexlify(text.encode(encoding, errors)), 16))[2:]
return bits.zfill(8 * ((len(bits) + 7) // 8))

def text_from_bits(bits, encoding='utf-8', errors='surrogatepass'):
n = int(bits, 2)
return int2bytes(n).decode(encoding, errors)

def int2bytes(i):
hex_string = '%x' % i
n = len(hex_string)
return binascii.unhexlify(hex_string.zfill(n + (n & 1)))
``````

### Example

``````>>> text_to_bits('hello')
'0110100001100101011011000110110001101111'
>>> text_from_bits('110100001100101011011000110110001101111') == u'hello'
True
``````
141
9/23/2015 6:01:04 PM

# Built-in only `python`

Here is a pure python method for simple strings, left here for posterity.

``````def string2bits(s=''):
return [bin(ord(x))[2:].zfill(8) for x in s]

def bits2string(b=None):
return ''.join([chr(int(x, 2)) for x in b])

s = 'Hello, World!'
b = string2bits(s)
s2 = bits2string(b)

print 'String:'
print s

print '\nList of Bits:'
for x in b:
print x

print '\nString:'
print s2
``````

``````String:
Hello, World!

List of Bits:
01001000
01100101
01101100
01101100
01101111
00101100
00100000
01010111
01101111
01110010
01101100
01100100
00100001

String:
Hello, World!
``````