org - Python 3.1.1 cadena a hex
python 64 bits (9)
Solución 2018:
def StrToHex(string):
HEX = ""
for x in string:HEX += hex(int(ord(x)))
return HEX
print (StrToHex("HG"))
Esto convierte cadena a hexadecimal.
Nota: probado con Python 3.6.1
Estoy tratando de usar str.encode()
pero obtengo
>>> "hello".encode(hex)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: must be string, not builtin_function_or_method
He intentado un montón de variaciones y parece que todas funcionan en Python 2.5.2, entonces, ¿qué debo hacer para que funcionen en Python 3.1?
En Python 3, codifique la cadena en bytes y use el método hex()
, devolviendo una cadena.
s = "hello".encode("utf-8").hex()
s
# ''68656c6c6f''
Opcionalmente, convierta la cadena a bytes:
b = bytes(s, "utf-8")
b
# b''68656c6c6f''
En Python 3, todas las cadenas son unicode. Por lo general, si codifica un objeto Unicode a una cadena, usa .encode(''TEXT_ENCODING'')
, ya que el hex
no es una codificación de texto, debe usar codecs.encode()
para manejar códecs arbitrarios. Por ejemplo:
>>>> "hello".encode(''hex'')
LookupError: ''hex'' is not a text encoding; use codecs.encode() to handle arbitrary codecs
>>>> import codecs
>>>> codecs.encode(b"hello", ''hex'')
b''68656c6c6f''
De nuevo, dado que "hello" es unicode, debe indicarlo como una cadena de bytes antes de codificar en hexadecimal. Esto puede ser más en línea con su enfoque original de usar el método de encode
.
Las diferencias entre binascii.hexlify
y codecs.encode
son las siguientes:
binascii.hexlify
Representación hexadecimal de datos binarios.
El valor de retorno es un objeto de bytes.
Tipo: builtin_function_or_method
codecs.encode
codificar (obj, [encoding [, errors]]) -> object
Codifica obj utilizando el códec registrado para la codificación. la codificación se establece de manera predeterminada en la codificación predeterminada. se pueden dar errores para establecer un esquema de manejo de errores diferente. El valor predeterminado es "estricto", lo que significa que los errores de codificación generan un ValueError. Otros valores posibles son ''ignorar'', ''reemplazar'' y ''xmlcharrefreplace'', así como cualquier otro nombre registrado con codecs.register_error que pueda manejar ValueErrors.
Tipo: builtin_function_or_method
Los métodos de Binascii son más fáciles por cierto
>>> import binascii
>>> x=b''test''
>>> x=binascii.hexlify(x)
>>> x
b''74657374''
>>> y=str(x,''ascii'')
>>> y
''74657374''
>>> x=binascii.unhexlify(x)
>>> x
b''test''
>>> y=str(x,''ascii'')
>>> y
''test''
Espero eso ayude. :)
Otro método más:
s = ''hello''
h = ''''.join([hex(ord(i)) for i in s]);
# outputs: ''0x680x650x6c0x6c0x6f''
Esto básicamente divide la cadena en caracteres, hace la conversión a través de hex(ord(char))
y une los caracteres nuevamente. En caso de que quiera el resultado sin el prefijo 0x
, haga lo siguiente:
h = ''''.join([str(hex(ord(i)))[2:4] for i in s]);
# outputs: ''68656c6c6f''
Probado con Python 3.5.3.
Utilice hexlify - http://epydoc.sourceforge.net/stdlib/binascii-module.html
Ya has obtenido algunas buenas respuestas, pero pensé que también te interesaría un poco de los antecedentes.
En primer lugar, te faltan las citas. Debería ser:
"hello".encode("hex")
En segundo lugar, este códec no se ha portado a Python 3.1. Mira here . Parece que todavía no han decidido si estos códecs deberían incluirse o no en Python 3 o implementarse de otra manera.
Si miras el archivo diff adjunto a ese error, puedes ver el método propuesto para implementarlo:
import binascii
output = binascii.b2a_hex(input)
base64.b16encode
y base64.b16decode
convierten bytes base64.b16decode
desde hexadecimal y funcionan en todas las versiones de Python. El enfoque de los codecs también funciona, pero es menos sencillo en Python 3.