18

I have a string that has both binary and string characters and I would like to convert it to binary first, then to hex.

The string is as below:

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

How do I go about converting this string in Python so that the output in hex format is similar to this below?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F
2
  • 5
    can you elaborate on the intended translation? It appears to me that the example string and the hex output are not the same thing... is <81> a single, not-printable hexadecimally encoded character or is it a textual representation of this? I'm confused by the string holding binary charaters (what do you mean by that) and that hou want to convert it to binary, then to hex... Commented Aug 6, 2009 at 10:08
  • Do this: print(repr(your_string))) and copy/paste the result into your question. Tell us what version of Python and what platform. Commented Aug 6, 2009 at 14:16

3 Answers 3

29

You can use ord and hex like this :

>>> 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
>>>

Or use the builtin encoding :

>>> s = 'some string'
>>> print s.encode('hex_codec')
736f6d6520737472696e67
>>>
Sign up to request clarification or add additional context in comments.

1 Comment

Your version with hex and ord does not work reliably. Use "%2.2x".__mod__ instead of hex and you can also avoid the c[2:4]. As a result it would look like: "".join(map("%2.2x".__mod__, map(ord, s))). The encoding version is of course better. :-)
12
>>> import binascii

>>> s = '2F'

>>> hex_str = binascii.b2a_hex(s)

>>> hex_str

>>> '3246'

OR

>>>import binascii

>>> hex_str = binascii.hexlify(s)

>>> hex_str
>>> '3246'
>>>

Comments

1

Faster solution see:

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)

Results:

import binascii

binascii.hexlify(value)

2.18547999816

value.encode('hex_codec')

2.91231595077

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.