Преобразование объекта Python str/unicode в двоичный/hex-блок

Есть ли простой способ получить некоторый объект str/unicode, представленный как большое двоичное число (или шестнадцатеричное)?

Я читал некоторые ответы на связанные вопросы, но ни один из них не работает для моего сценария.

Я попытался использовать struct модуль STL, но он не работал должным образом. Символы, как и в двоичных файлах, отображаются как символы символов.

Я пытаюсь сделать что-то невозможное?

Пример:

def strbin(inp):
    # sorcery!
    return out

>> print strbin("hello")
# Any of these is cool (outputs are random keystrokes)
0b1001010101010000111001110001...
0xad9f...

Ответ 1

Вы можете попробовать bitarray:

>>> import bitarray
>>> b = bitarray.bitarray()
>>> b.fromstring('a')
>>> b
bitarray('01100001')
>>> b.to01()
'01100001'
>>> b.fromstring('pples')
>>> b.tostring()
'apples'
>>> b.to01()
'011000010111000001110000011011000110010101110011'

Ответ 2

Довольно простые и не требующие модулей от pypi:

def strbin(s):
    return ''.join(format(ord(i),'0>8b') for i in s)

Для этого вам понадобится Python 2.6+.

Ответ 3

def strhex(str):
    h=""
    for x in str:
        h=h+(hex(ord(x)))[2:]
    return "0x"+h

Ответ 4

Срез из более крупной печатной функции, которую я написал, печатает код ascii в шестнадцатеричном формате. Просто более Pythonic версия предыдущей функции ответа. Кроме того, он корректно работает для символов с однозначными кодами ascii.

def strhex(string, start = '0x'):
    return start + ''.join(('{:x}'.format(ord(char))).zfill(2) for char in string)

Ответ 5

Это в основном ответ Ravi, но с крошечным исправлением, так что все ему доверяют, но консенсус среди рецензентов заключался в том, что это было слишком большим для изменения только сделайте редактирование и должен быть отдельным ответом вместо этого... Не знаю, почему.

def strhex(str):
    h=""
    for x in str:
        h=h+("0" + (hex(ord(x)))[2:])[-2:]
    return "0x"+h

Разница в том, что в строке 4 вам нужно проверить, меньше ли символ меньше 0x10, и в этом случае добавить ноль, иначе, например. 0x1101 становится 0x111.