Как декодировать двоичный контент в исходное строковое содержимое в python?

У меня есть строка, которую мне нужно закодировать в двоичный код. Очень важно, чтобы я получил строку значения типа «11010011100...», потому что позже мне нужно будет вставить ее в самый младший бит пикселей изображения в градациях серого. (В основном я скрываю сообщение внутри изображения.) Я нахожусь в Windows 10, используя python 3.6.8.

Следуя этой ссылке, я написал этот метод для его кодирования:

def message2bin(msg):
    """
    Converts a msg to binary format
    :param msg: message to convert
    :return: binary content of message in string format
    """
    message_bin = ''.join(format(x, 'b') for x in bytearray(msg, 'utf-8'))
    return message_bin

msg = 'Hello world'
print(message2bin(msg)) 

Вывод: 1001000110010111011001101100110111110000011101111101111111001011011001100100

Теперь я хочу иметь способ взять этот двоичный поток и сделать исходное сообщение следующим образом:

bin2message(message2bin(msg))
>> Hello world

Я пробовал следующее:

print(bytearray(message2bin(msg), 'utf-8').decode(encoding))

Но вывод снова:

>> 1001000110010111011001101100110111110000011101111101111111001011011001100100

Также я не понимаю, почему длина двоичного сообщения 76, а не 78? Во-первых, каждый символ занимает 7 бит, а не 8, что я не понимаю, почему. Кроме того, даже с 7 битами «Hello world» имеет 11 символов, поэтому я ожидаю длину 77, но это дает мне 76? Может кто-нибудь объяснить мне это?

print(len(message2bin(msg)))
>> 76

Спасибо всем за ваш ценный вклад.


person E. Erfan    schedule 21.11.2020    source источник