2013-09-15 2 views
45

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

st = "hello world" 
toBinary(st) 

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

+8

Что вы ожидаете от вывода, в частности? – NPE

+0

Под «двоичным», вы имеете в виду тип 0101010 или «порядковый номер каждого символа в (например, hex)? – cdarke

+0

Предполагая, что вы на самом деле имеете в виду двоичные (нули и единицы), вам нужно бинарное представление каждого символа (8 бит на символ) один за другим? например h is ascii значение 104 будет 01101000 в двоичном – ChrisProsser

ответ

63

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

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

Или если вы хотите, чтобы каждый двоичный номер был 1 байт: '. .join (format (ord (i),' b ') .zfill (8) для i в st) – ChrisProsser

+4

Для полных байтов вы также можете использовать '. '.join (' {0: 08b} '. format (ord (x),' b ') для x в st)' , что примерно на 35% быстрее, чем решение 'zfill (8)' (по крайней мере, на моей машине). – max

+0

Как насчет преобразования символов более одного байт, например 'β', например, который, как мне кажется, представлен' 11001110 10110010' внутренне? –

10

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

27

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

+3

Не только это более pythonic, но это «больше» правильно для многобайтовых строк без ASCII. –

Смежные вопросы