У меня есть строка, которую мне нужно закодировать в двоичный код. Очень важно, чтобы я получил строку значения типа «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
Спасибо всем за ваш ценный вклад.