Преобразование объекта Python str / unicode в двоичный / шестнадцатеричный blob

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

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

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

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

пример:

def strbin(inp):
    # sorcery!
    return out

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

5 ответов


можно попробовать bitarray:

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

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

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

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


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

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

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

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

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

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