2009-08-06 28 views
9

Tengo una cadena que tiene tanto caracteres binarios como de cadena y me gustaría convertirla a binario primero, luego a hexadecimal.Python: conversión de cadena binaria/hexagonal?

La cadena es de la siguiente manera:

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

¿Cómo hago para convertir esta cadena en Python para que la salida en formato hexadecimal es similar a la inferior?

24208040901811001B12050809081223431235113245422F0A23000000000000000000001F 
+5

puede elaborar sobre la traducción deseada? Me parece que la cadena de ejemplo y la salida hexadecimal no son lo mismo ... es <81> un carácter codificado hexadecimalmente único no imprimible o es una representación textual de esto? Estoy confundido por la cadena que contiene caracteres binarios (¿a qué te refieres con eso?) Y que quieres convertirlo en binario, luego en hexadecimal ... – Adriaan

+0

Haz esto: 'print (repr (your_string)))' y copia/pegue el resultado en su pregunta. Cuéntanos qué versión de Python y qué plataforma. –

Respuesta

22

Puede utilizar ord y hex así:

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

O utilizar la codificación incorporada:

>>> s = 'some string' 
>>> print s.encode('hex_codec') 
736f6d6520737472696e67 
>>> 
+1

Su versión con 'hex' y' ord' no funciona de manera confiable. Use "% 2.2x" .__ mod__ en lugar de hexadecimal y también puede evitar el 'c [2: 4]'. Como resultado, se vería como: '" ".join (map ("% 2.2x ".__ mod__, map (ord, s)))'. La versión de codificación es, por supuesto, mejor. :-) –

+0

Genial, ¡respuesta! – Japanish

1

más rápida solución Ver:

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) 

Resultados:

import binascii 

binascii.hexlify(value) 

2.18547999816 

value.encode('hex_codec') 

2.91231595077 
7
>>> import binascii 

>>> s = '2F' 

>>> hex_str = binascii.b2a_hex(s) 

>>> hex_str 

>>> '3246' 

O

>>>import binascii 

>>> hex_str = binascii.hexlify(s) 

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