Python: двоичное / шестнадцатеричное преобразование строки? - PullRequest
13 голосов
/ 06 августа 2009

У меня есть строка, содержащая как двоичные, так и строковые символы, и я хотел бы сначала преобразовать ее в двоичный код, а затем в шестнадцатеричный.

Строка, как показано ниже:

<81>^Q<81>"^Q^@^[)^G ^Q^A^S^A^V^@<83>^Cd<80><99>}^@N^@^@^A^@^@^@^@^@^@^@j

Как мне преобразовать эту строку в Python, чтобы вывод в шестнадцатеричном формате был похож на приведенный ниже?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F

Ответы [ 3 ]

24 голосов
/ 06 августа 2009

Вы можете использовать ord и hex следующим образом:

>>> s = 'some string'
>>> hex_chars = map(hex,map(ord,s))
>>> print hex_chars
['0x73', '0x6f', '0x6d', '0x65', '0x20', '0x73', '0x74', '0x72', '0x69', '0x6e', '0x67']
>>> hex_string = "".join(c[2:4] for c in hex_chars)
>>> print hex_string
736f6d6520737472696e67
>>>

Или используйте встроенную кодировку:

>>> s = 'some string'
>>> print s.encode('hex_codec')
736f6d6520737472696e67
>>>
9 голосов
/ 19 октября 2011
>>> import binascii

>>> s = '2F'

>>> hex_str = binascii.b2a_hex(s)

>>> hex_str

>>> '3246'

OR

>>>import binascii

>>> hex_str = binascii.hexlify(s)

>>> hex_str
>>> '3246'
>>>
1 голос
/ 27 сентября 2011

Более быстрое решение см .:

from timeit import Timer

import os
import binascii

def testSpeed(statement, setup = 'pass'):
  print '%s' % statement
  print '%s' % Timer(statement, setup).timeit()

setup = """
import os

value = os.urandom(32)
"""

# winner
statement = """
import binascii

binascii.hexlify(value)
"""

testSpeed(statement, setup)

# loser
statement = """
import binascii

value.encode('hex_codec')
"""

testSpeed(statement, setup)

Результаты:

import binascii

binascii.hexlify(value)

2.18547999816

value.encode('hex_codec')

2.91231595077
...