Преобразование объекта 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.