Подтвердить что ты не робот

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

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

st = "hello world"
toBinary(st)

Есть ли какой-нибудь аккуратный способ сделать это?

4b9b3361

Ответ 1

Что-то вроде этого?

>>> 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'

Ответ 2

Как более питонический способ, вы можете сначала преобразовать строку в байтовый массив, а затем использовать 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.

Ответ 3

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

Ответ 4

Нам просто нужно закодировать это.

'string'.encode('ascii')

Ответ 5

Это обновление для существующих ответов, которое использовало 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>

Ответ 6

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

Ответ 7

В 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 (двоичное).