Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you translate strings to padded binary in python?

Tags:

python

I have made a program that translates a text into binary code but its really messy. This is my code:

def converter():
    print("message:")
    inputMsg = input()
    msg = ''
    for letter in inputMsg:
        if letter == 'a':
            msg = msg + '01100001'
        elif letter == 'b':
            msg = msg + '01100010'
        elif letter == 'c':
            msg = msg + '01100011'
        elif letter == 'd':
            msg = msg + '01100100'
        elif letter == 'e':
            msg = msg + '01100101'
        elif letter == 'f':
            msg = msg + '01100110'
        elif letter == 'g':
            msg = msg + '011000111'
        elif letter == 'h':
            msg = msg + '01101000'
        elif letter == 'i':
            msg = msg + '01101001'
        elif letter == 'j':
            msg = msg + '01101010'
        elif letter == 'k':
            msg = msg + '01101011'
        elif letter == 'l':
            msg = msg + '01101100'
        elif letter == 'm':
            msg = msg + '01101101'
        elif letter == 'n':
            msg = msg + '01101110'
        elif letter == 'o':
            msg = msg + '01101111'
        elif letter == 'p':
            msg = msg + '01110000'
        elif letter == 'q':
            msg = msg + '01110001'
        elif letter == 'r':
            msg = msg + '01100010'
        elif letter == 's':
            msg = msg + '01110011'
        elif letter == 't':
            msg = msg + '01110100'
        elif letter == 'u':
            msg = msg + '01110101'
        elif letter == 'v':
            msg = msg + '01110110'
        elif letter == 'w':
            msg = msg + '01110111'
        elif letter == 'x':
            msg = msg + '01111000'
        elif letter == 'y':
            msg = msg + '01111001'
        elif letter == 'z':
            msg = msg + '01111010'

        elif letter == 'A':
            msg = msg + '01000001'
        elif letter == 'B':
            msg = msg + '01000010'
        elif letter == 'C':
            msg = msg + '01000011'
        elif letter == 'D':
            msg = msg + '01000100'
        elif letter == 'E':
            msg = msg + '01000101'
        elif letter == 'F':
            msg = msg + '01000110'
        elif letter == 'G':
            msg = msg + '01000111'
        elif letter == 'H':
            msg = msg + '01001000'
        elif letter == 'I':
            msg = msg + '01001001'
        elif letter == 'J':
            msg = msg + '01001010'
        elif letter == 'K':
            msg = msg + '01001011'
        elif letter == 'L':
            msg = msg + '01001100'
        elif letter == 'M':
            msg = msg + '01001101'
        elif letter == 'N':
            msg = msg + '01001110'
        elif letter == 'O':
            msg = msg + '01001111'
        elif letter == 'P':
            msg = msg + '01010000'
        elif letter == 'Q':
            msg = msg + '01010001'
        elif letter == 'R':
            msg = msg + '01000010'
        elif letter == 'S':
            msg = msg + '01010011'
        elif letter == 'T':
            msg = msg + '01010100'
        elif letter == 'U':
            msg = msg + '01010101'
        elif letter == 'V':
            msg = msg + '01010110'
        elif letter == 'W':
            msg = msg + '01010111'
        elif letter == 'X':
            msg = msg + '01011000'
        elif letter == 'Y':
            msg = msg + '01011001'
        elif letter == 'Z':
            msg = msg + '01011010'
        elif letter == ' ':
            msg = msg + '00100000'

    print('\n',msg,'\n')
    print('do again?  (y/n)')
    yn()

def yn():
    yn = input()
    if yn == 'y':
        converter()
    elif yn == 'n':
        pass
    else:
        yn()


 converter()

My output is OK but you see i have an if/else for every letter. Is there an other way to do it clean and a bit more efficient?

like image 702
svs Avatar asked Dec 15 '22 12:12

svs


1 Answers

>>> st = "hello"
>>> ' '.join(format(ord(x), '08b') for x in st)
'01101000 01100101 01101100 01101100 01101111

What happens here is that we loop over every character, x, in string st. On each of those items we run ord(), which converts the character x into a integer representing the Unicode code point, e.g. 'T' == 84. This number we then .format into (padded) binary. 08 here means that the number is to be formatted to be 8 digits long, padded by 0 from the left. b then indicates that it is to be in binary, or base 2. The number has to be padded or there would be no leading zeroes.

like image 83
Stiffo Avatar answered Jan 06 '23 06:01

Stiffo