Использование этого кода для получения строки и преобразования ее в двоичный файл:
bin(reduce(lambda x, y: 256*x+y, (ord(c) for c in'hello'), 0))
это выводит:
0b110100001100101011011000110110001101111
Который, если я помещу его на этот сайт (на сайте справа), я получу свое сообщение hello обратно. Мне интересно, какой метод он использует. Я знаю, что мог бы разделить строку двоичного файла на 8, а затем сопоставить ее с соответствующим значением to bin(ord(character)) или каким-либо другим способом. Действительно ищу что-нибудь попроще.
Вот чистый метод python для простых строк, оставленный здесь для потомков.
defstring2bits(s=''): return [bin(ord(x))[2:].zfill(8) for x in s]
defbits2string(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!
Ответ 3
Я не уверен, как, по-вашему, вы можете это сделать, кроме как посимвольно - по сути, это посимвольная операция. Безусловно, существует код, который сделает это за вас, но нет "более простого" способа, чем выполнять это посимвольно.
Во-первых, вам нужно убрать префикс 0b и дополнить строку нулем слева, чтобы ее длина была кратна 8, чтобы упростить разделение битовой строки на символы:
Затем вы разделяете строку на блоки по восемь двоичных цифр, преобразуете их в символы ASCII и соединяете их обратно в строку:
string_blocks = (bitstring[i:i+8] for i inrange(0, len(bitstring), 8)) string = ''.join(chr(int(char, 2)) for char in string_blocks)
Если вы действительно хотите рассматривать его как число, вам все равно придется учитывать тот факт, что самый левый символ будет иметь длину не более семи цифр, если вы хотите перейти слева направо, а не справа налево.