Конвертировать объект Python str / unicode в двоичный / шестнадцатеричный BLOB-объект - PullRequest
10 голосов
/ 18 июля 2011

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

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

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

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

Пример:

def strbin(inp):
    # sorcery!
    return out

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

Ответы [ 5 ]

17 голосов
/ 18 июля 2011

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

>>> import bitarray
>>> b = bitarray.bitarray()
>>> b.fromstring('a')
>>> b
bitarray('01100001')
>>> b.to01()
'01100001'
>>> b.fromstring('pples')
>>> b.tostring()
'apples'
>>> b.to01()
'011000010111000001110000011011000110010101110011'
7 голосов
/ 18 июля 2011

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

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

Вам понадобится Python 2.6+ для его использования.

1 голос
/ 18 июля 2011

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

def strhex(string, start = '0x'):
    return start + ''.join(('{:x}'.format(ord(char))).zfill(2) for char in string)
1 голос
/ 18 июля 2011
def strhex(str):
    h=""
    for x in str:
        h=h+(hex(ord(x)))[2:]
    return "0x"+h
0 голосов
/ 17 ноября 2015

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

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

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

...