Преобразование строки в двоичный код в python
Мне нужен способ получить двоичное представление строки в python. например,
st = "hello world"
toBinary(st)
есть ли модуль какого-то аккуратного способа сделать это?
5 ответов:
что-то вроде этого?
>>> 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'
как более питонный способ вы можете сначала преобразовать строку в массив байтов, а затем использовать
вы можете получить доступ к значениям кода для символов в строке с помощью
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.
Это обновление для существующих ответов, который используется
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 значительно более эффективен при преобразовании в массив байтов, потому что он делает вызовы функций низкого уровня вместо того, чтобы вручную преобразовывать каждый символ в целое число, а затем преобразовывать это целое число в его двоичное значение.