Мне нужен способ получить двоичное представление строки в python. например
st = "hello world"
toBinary(st)
Есть ли какой-нибудь аккуратный способ сделать это?
Мне нужен способ получить двоичное представление строки в python. например
st = "hello world"
toBinary(st)
Есть ли какой-нибудь аккуратный способ сделать это?
Что-то вроде этого?
>>> st = "hello world"
>>> ' '.join(format(ord(x), 'b') for x in st)
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
#using `bytearray`
>>> ' '.join(format(x, 'b') for x in bytearray(st))
'1101000 1100101 1101100 1101100 1101111 100000 1110111 1101111 1110010 1101100 1100100'
Как более питонический способ, вы можете сначала преобразовать строку в байтовый массив, а затем использовать bin
функцию в map
:
>>> st = "hello world"
>>> map(bin,bytearray(st))
['0b1101000', '0b1100101', '0b1101100', '0b1101100', '0b1101111', '0b100000', '0b1110111', '0b1101111', '0b1110010', '0b1101100', '0b1100100']
Или вы можете присоединиться к нему:
>>> ' '.join(map(bin,bytearray(st)))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Обратите внимание, что в python3 вам нужно указать кодировку для функции bytearray
:
>>> ' '.join(map(bin,bytearray(st,'utf8')))
'0b1101000 0b1100101 0b1101100 0b1101100 0b1101111 0b100000 0b1110111 0b1101111 0b1110010 0b1101100 0b1100100'
Вы также можете использовать модуль binascii
в python 2:
>>> import binascii
>>> bin(int(binascii.hexlify(st),16))
'0b110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'
hexlify
возвращает шестнадцатеричное представление двоичных данных, затем вы можете преобразовать в int, указав 16 в качестве базы, затем преобразуйте его в двоичный с bin
.
Вы можете получить доступ к значениям кода для символов в вашей строке с помощью встроенной функции ord()
. Если вам нужно отформатировать это в двоичном формате, метод string.format()
выполнит задание.
a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
(Спасибо Ashwini Chaudhary за публикацию этого фрагмента кода.)
Хотя вышеприведенный код работает в Python 3, этот вопрос усложняется, если вы принимаете какую-либо кодировку, отличную от UTF-8. В Python 2 строки являются байтовыми последовательностями, а по умолчанию используется кодировка ASCII. В Python 3 предполагается, что строки являются Unicode, и существует отдельный тип bytes
, который больше похож на строку Python 2. Если вы хотите принять какую-либо кодировку, отличную от UTF-8, вам нужно указать кодировку.
В Python 3 вы можете сделать что-то вроде этого:
a = "test"
a_bytes = bytes(a, "ascii")
print(' '.join(["{0:b}".format(x) for x in a_bytes]))
Различия между кодировками UTF-8 и ascii не будут очевидны для простых буквенно-цифровых строк, но станут важными, если вы обрабатываете текст, который включает символы, не содержащие набор символов ascii.
Нам просто нужно закодировать это.
'string'.encode('ascii')
Это обновление для существующих ответов, которое использовало bytearray()
и больше не может работать так:
>>> st = "hello world"
>>> map(bin, bytearray(st))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
Поскольку, как объясняется в ссылке выше, если источником является строка, вы также должны указать кодировку:
>>> map(bin, bytearray(st, encoding='utf-8'))
<map object at 0x7f14dfb1ff28>
def method_a(sample_string):
binary = ' '.join(format(ord(x), 'b') for x in sample_string)
def method_b(sample_string):
binary = ' '.join(map(bin,bytearray(sample_string,encoding='utf-8')))
if __name__ == '__main__':
from timeit import timeit
sample_string = 'Convert this ascii strong to binary.'
print(
timeit(f'method_a("{sample_string}")',setup='from __main__ import method_a'),
timeit(f'method_b("{sample_string}")',setup='from __main__ import method_b')
)
# 9.564299999998184 2.943955828988692
method_b существенно более эффективен при преобразовании в массив байтов, потому что он делает вызовы функций низкого уровня вместо того, чтобы вручную преобразовывать каждый символ в целое число, а затем преобразовывать это целое в его двоичное значение.
В Python версии 3.6 и выше вы можете использовать 'f-string' для форматирования результата.
str = "hello world"
print(" ".join(f"{ord(i):08b}" for i in str))
01101000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100
Левая часть двоеточия, ord (i), является фактическим объектом, значение которого будет отформатировано и вставлено в выходные данные. Использование ord() дает кодовую точку base-10 для одного символа str.
Правая часть двоеточия - это спецификатор формата. 08 означает ширину 8, дополняется 0, а b действует как знак для вывода результирующего числа в основание 2 (двоичное).