Преобразование строки в двоичный код в python


Мне нужен способ получить двоичное представление строки в python. например,

st = "hello world"
toBinary(st)

есть ли модуль какого-то аккуратного способа сделать это?

5 55

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