Мне нужен способ получить двоичное представление строки в python. напримерПреобразование строки в двоичный файл в python
st = "hello world"
toBinary(st)
Есть ли какой-нибудь модуль, способный сделать это?
Мне нужен способ получить двоичное представление строки в python. напримерПреобразование строки в двоичный файл в 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'
Или если вы хотите, чтобы каждый двоичный номер был 1 байт: '. .join (format (ord (i),' b ') .zfill (8) для i в st) – ChrisProsser
Для полных байтов вы также можете использовать '. '.join (' {0: 08b} '. format (ord (x),' b ') для x в st)' , что примерно на 35% быстрее, чем решение 'zfill (8)' (по крайней мере, на моей машине). – max
Как насчет преобразования символов более одного байт, например 'β', например, который, как мне кажется, представлен' 11001110 10110010' внутренне? –
Вы можете получить доступ к значениям кода для символов в строке, используя встроенную функцию ord()
. Если вам нужно отформатировать это в двоичном формате, то метод string.format()
выполнит эту работу.
a = "test"
print(' '.join(format(ord(x), 'b') for x in a))
(Благодаря Ашвини Чаудхари для размещения этого фрагмента кода.)
Хотя приведенный выше код работает в 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.
Как более вещий образом вы можете сначала преобразовать вашу строку в массив байтов используйте 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
возвращение шестнадцатеричное представление двоичных данных, то вы можете преобразовать в целое, указав 16 в качестве своей базы затем преобразовать его в двоичный с bin
.
Не только это более pythonic, но это «больше» правильно для многобайтовых строк без ASCII. –
Что вы ожидаете от вывода, в частности? – NPE
Под «двоичным», вы имеете в виду тип 0101010 или «порядковый номер каждого символа в (например, hex)? – cdarke
Предполагая, что вы на самом деле имеете в виду двоичные (нули и единицы), вам нужно бинарное представление каждого символа (8 бит на символ) один за другим? например h is ascii значение 104 будет 01101000 в двоичном – ChrisProsser