Convertir Hex a Byte en Python

Rayven Esplanada 19 septiembre 2023
  1. Inicializar un valor hexadecimal
  2. Usar la función bytes.fromhex() para convertir Hex a Byte en Python
  3. Usar el módulo binascii para convertir de Hex a Byte en Python
  4. Utilice el método codecs.decode() para convertir un hexadecimal a byte en Python.
  5. Utilice la comprensión de lista y la función int() para convertir un hexadecimal a byte en Python.
  6. Conclusión
Convertir Hex a Byte en Python

El sistema hexadecimal, abreviado como hex, utiliza 16 símbolos (0-9, a-f) para representar valores, a diferencia del sistema decimal que utiliza 10 símbolos. Por ejemplo, 1000 en decimal es 3E8 en hexadecimal.

Tener habilidad para manejar hexadecimal es crucial en tareas de programación que involucran datos binarios, direcciones de memoria y codificación de bajo nivel. Este tutorial te mostrará cómo convertir valores hexadecimales en una representación literal de bytes en Python.

Inicializar un valor hexadecimal

Creemos un valor hexadecimal utilizando una cadena de texto y convirtamos la frase A quick brown fox en un valor hexadecimal utilizando la función hexlify() en el módulo binascii.

Para convertir una cadena de texto en hexadecimal, primero tenemos que convertir la cadena en bytes.

import binascii

str_val = "A quick brown fox".encode("utf-8")
hex_val = binascii.hexlify(str_val).decode("utf-8")

print(hex_val)

Salida:

4120717569636b2062726f776e20666f78

Ahora hemos convertido exitosamente una cadena de texto en hexadecimal. A continuación, procedamos a convertir el hexadecimal nuevamente en bytes.

Usar la función bytes.fromhex() para convertir Hex a Byte en Python

El método bytes.fromhex() está diseñado para convertir una cadena hexadecimal válida en un objeto bytes. Tiene la siguiente sintaxis:

bytes.fromhex(hex_string)
  • hex_string: Este es un argumento requerido y representa la cadena hexadecimal de entrada que deseas convertir en una representación literal de bytes.

Así es cómo funciona el método bytes.fromhex():

  1. Validación de la entrada: El método primero valida la entrada “hex_string” para asegurarse de que solo contenga caracteres hexadecimales válidos (dígitos 0-9 y letras minúsculas o mayúsculas A-F). Si la cadena contiene algún otro caracter, se levantará una excepción “ValueError”.
  2. Procesamiento de pares: El método procesa la cadena hexadecimal de dos caracteres a la vez, tratando cada par de caracteres como un solo byte hexadecimal. Esto significa que por cada dos caracteres en la cadena de entrada, se genera un byte en el objeto resultante “bytes”.
  3. Conversión a bytes: Cada par de caracteres hexadecimales se convierte en su equivalente binario.
  4. Construcción del objeto “bytes”: A medida que el método procesa los pares de caracteres hexadecimales, construye un objeto “bytes” añadiendo la representación binaria de cada byte. Este proceso continúa hasta que se ha procesado toda la cadena de entrada.
  5. Valor de retorno: Una vez que se ha procesado toda la cadena de entrada, el método devuelve el objeto “bytes” resultante, que representa la representación literal de bytes del valor hexadecimal de entrada.

Como ejemplo, tomaremos el valor hexadecimal del resultado anterior y utilizaremos “fromhex()” para convertirlo en una representación literal de bytes.

hex_val = "4120717569636b2062726f776e20666f78"

print(bytes.fromhex(hex_val))

Salida:

b'A quick brown fox'

Desglosemos la cadena hexadecimal del ejemplo “4120717569636b2062726f776e20666f78” para entender mejor cómo se convierte en una representación literal de bytes:

  • “41” se convierte en el byte 65 (valor ASCII de ‘A’).
  • “20” se convierte en el byte 32 (valor ASCII de espacio).
  • “71” se convierte en el byte 113 (valor ASCII de ‘q’).
  • “75” se convierte en el byte 117 (valor ASCII de ‘u’).
  • “69” se convierte en el byte 105 (valor ASCII de ‘i’).
  • “63” se convierte en el byte 99 (valor ASCII de ‘c’).
  • “6b” se convierte en el byte 107 (valor ASCII de ‘k’).
  • “20” se convierte en el byte 32 (valor ASCII de espacio).
  • “62” se convierte en el byte 98 (valor ASCII de ‘b’).
  • “72” se convierte en el byte 114 (valor ASCII de ‘r’).
  • “6f” se convierte en el byte 111 (valor ASCII de ‘o’).
  • “77” se convierte en el byte 119 (valor ASCII de ‘w’).
  • “6e” se convierte en el byte 110 (valor ASCII de ’n’).
  • “20” se convierte en el byte 32 (valor ASCII de espacio).
  • “66” se convierte en el byte 102 (valor ASCII de ‘f’).
  • “6f” se convierte en el byte 111 (valor ASCII de ‘o’).
  • “78” se convierte en el byte 120 (valor ASCII de ‘x’).

Cuando se combinan todos estos bytes, obtienes la representación literal de bytes “A quick brown fox”, que es el resultado final.

Usar el módulo binascii para convertir de Hex a Byte en Python

El módulo de Python binascii contiene funciones de utilidad eficientes para operaciones binarias y ASCII. En particular, “unhexlify()” es una función dentro del módulo “binascii” que convierte un valor hexadecimal en una representación literal de bytes.

Esta función tiene la siguiente sintaxis:

binascii.unhexlify(hex_string)
  • “hex_string”: Este es el argumento requerido que representa la cadena hexadecimal de entrada que deseas convertir en una representación literal de bytes.

Aquí tienes una explicación detallada de cómo funciona:

  1. Validación de la entrada: El método comienza validando el argumento “hex_string” para asegurarse de que solo contenga caracteres hexadecimales válidos. Cualquier carácter inválido en la cadena de entrada resultará en una excepción “binascii.Error”.
  2. Conversión de pares hexadecimales: Luego, el método procesa la cadena “hex_string” en pares de caracteres. Por ejemplo, “41” representa el byte con el valor entero 65 (valor ASCII de ‘A’).
  3. Conversión a bytes: Los pares de bytes hexadecimales se convierten en su representación binaria. Cada par se transforma en un byte correspondiente, con cada carácter representando 4 bits.
  4. Construcción del literal de bytes: A medida que el método procesa cada par, agrega los bytes binarios resultantes para formar un literal de bytes completo. Este proceso continúa hasta que se haya procesado toda la cadena de entrada.
  5. Valor de retorno: Una vez que se ha procesado la cadena hexadecimal completa, la función unhexlify() devuelve el literal de bytes resultante, representado como un objeto bytes.

Inicialicemos un nuevo ejemplo con caracteres especiales no ASCII, que luego se convertirán en un valor hexadecimal. El ejemplo será la traducción griega de la frase A quick brown fox.

import binascii
from binascii import unhexlify

str_val = "Μια γρήγορη καφέ αλεπού".encode(
    "utf-8"
)  # A quick brown fox in Greek translation
hex_val = binascii.hexlify(str_val).decode("utf-8")

print("String value: ", str_val.decode("utf-8"))
print("Hexadecimal: ", hex_val)
print("Byte value: ", unhexlify(hex_val))

Salida:

String value:  Μια γρήγορη καφέ αλεπού
Hexadecimal:  ce9cceb9ceb120ceb3cf81ceaeceb3cebfcf81ceb720cebaceb1cf86cead20ceb1cebbceb5cf80cebfcf8d
Byte value:  b'\xce\x9c\xce\xb9\xce\xb1 \xce\xb3\xcf\x81\xce\xae\xce\xb3\xce\xbf\xcf\x81\xce\xb7 \xce\xba\xce\xb1\xcf\x86\xce\xad \xce\xb1\xce\xbb\xce\xb5\xcf\x80\xce\xbf\xcf\x8d'

Ahora hemos convertido con éxito los valores hexadecimales a bytes.

Utilice el método codecs.decode() para convertir un hexadecimal a byte en Python.

La función codecs.decode() también se puede utilizar para convertir una cadena hexadecimal en bytes. Forma parte del módulo codecs de Python, que proporciona diversas funcionalidades de codificación y decodificación para diferentes representaciones de datos.

Tiene la siguiente sintaxis:

codecs.decode(data, encoding, errors="strict")
  • data: este es el argumento requerido que representa los datos que desea decodificar. En este caso, debería ser la cadena hexadecimal que desea convertir en un literal de bytes.
  • encoding: este también es un argumento requerido que especifica la codificación que se usará para la decodificación. Cuando se trabaja con cadenas hexadecimales, se debe usar la codificación hex para indicar que la cadena de entrada representa un valor hexadecimal.
  • errors (opcional): este argumento especifica cómo manejar los errores de decodificación, como cuando la cadena de entrada contiene caracteres no válidos para la codificación especificada. Tiene un valor predeterminado de strict, pero se puede cambiar a ignore o replace para manejar los errores de manera diferente.

Aquí se explica detalladamente cómo funciona este método cuando se usa para decodificar valores hexadecimales:

  1. Validación de entrada: el método primero verifica la validez del argumento data para asegurarse de que contenga solo caracteres hexadecimales válidos. Si la cadena de entrada contiene cualquier carácter no hexadecimal, se generará un UnicodeDecodeError con detalles sobre el carácter problemático.
  2. Proceso de decodificación: la función codecs.decode() interpreta el argumento data como una cadena hexadecimal y lo convierte en datos binarios. Procesa la cadena de entrada en pares de caracteres, tratando cada par como un solo byte hexadecimal.
  3. Especificación de codificación: el argumento encoding es crucial en este contexto. Cuando se especifica 'hex' como codificación, indica a Python que interprete la cadena de entrada como un valor hexadecimal y lo convierta en consecuencia.
  4. Conversión a bytes: a medida que el método procesa cada par de caracteres hexadecimales, los convierte en su representación binaria. Esta transformación da como resultado la creación de un literal de bytes, donde cada par de caracteres corresponde a un solo byte.
  5. Valor de retorno: el método codecs.decode() devuelve el literal de bytes resultante como un objeto bytes, que representa los datos binarios decodificados.

Vea el siguiente ejemplo:

import codecs

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = codecs.decode(hex_val, "hex")
print(byte_val)

Este programa decodifica la cadena hex_val utilizando la función codecs.decode() con el argumento de codificación configurado como hex. Esto significa que interpretará la cadena de entrada como un valor hexadecimal y lo convertirá en bytes.

Salida:

b'A quick brown fox'

Utilice la comprensión de lista y la función int() para convertir un hexadecimal a byte en Python.

Este método consiste en usar la comprensión de lista y la función int() para convertir una cadena hexadecimal en bytes.

hex_val = "4120717569636b2062726f776e20666f78"
byte_val = bytes([int(hex_val[i : i + 2], 16) for i in range(0, len(hex_val), 2)])
print(byte_val)

Aquí, el código utiliza una comprensión de lista para iterar sobre la cadena hexadecimal en pares de dos caracteres, convierte cada par en un entero en base 16 (hexadecimal) y crea una lista de estos enteros.

Luego se utiliza el constructor bytes() para convertir esta lista de enteros en un objeto de bytes.

Salida:

b'A quick brown fox'

Este método es especialmente útil cuando tenemos una cadena hexadecimal con una estructura conocida y queremos convertirla eficientemente en bytes. Proporciona control sobre el proceso de conversión al permitirnos especificar la base de codificación (en este caso, base 16 para hexadecimal).

Conclusión

En este artículo, hemos cubierto algunas formas de convertir valores hexadecimales en literales de bytes en Python.

La función fromhex() es preferible si no deseas importaciones adicionales en tu código fuente. De lo contrario, puedes elegir el método que mejor se adapte a tus necesidades y estilo de programación.

Rayven Esplanada avatar Rayven Esplanada avatar

Skilled in Python, Java, Spring Boot, AngularJS, and Agile Methodologies. Strong engineering professional with a passion for development and always seeking opportunities for personal and career growth. A Technical Writer writing about comprehensive how-to articles, environment set-ups, and technical walkthroughs. Specializes in writing Python, Java, Spring, and SQL articles.

LinkedIn

Artículo relacionado - Python Bytes

Artículo relacionado - Python Hex