HOWTO · Python

Converter Hex em Byte em Python

Este tutorial apresenta como converter valores hexadecimais em um literal de byte em Python.

Nesta página

Hexadecimal, abreviado para hex, usa 16 símbolos (0-9, a-f) para representar valores, contrastando com os 10 símbolos do decimal. Por exemplo, 1000 em decimal é 3E8 em hex.

A habilidade em lidar com hex é crucial para tarefas de programação envolvendo dados binários, endereços de memória e codificação de baixo nível. Este tutorial apresentará como converter valores hexadecimais em um literal de byte em Python.

Inicializar um Valor Hexadecimal

Vamos criar um valor hexadecimal usando uma string e converter a frase “A quick brown fox” em um valor hex usando a função “hexlify()” no módulo “binascii”.

Para converter uma string em hexadecimal, primeiro precisamos convertê-la em bytes.

import binascii

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

print(hex_val)

Saída:

4120717569636b2062726f776e20666f78

Agora, convertemos com sucesso uma string em hexadecimal. Em seguida, vamos converter hexadecimal de volta em bytes.

Use a Função “bytes.fromhex()” para Converter Hex em Byte em Python

O método “bytes.fromhex()” é projetado para converter uma string hexadecimal válida em um objeto “bytes”. Ele possui a seguinte sintaxe:

bytes.fromhex(hex_string)
  • “hex_string”: Este é um argumento obrigatório e representa a string hexadecimal de entrada que você deseja converter em um literal de byte.

Veja como o método “bytes.fromhex()” funciona:

  1. Validação de Entrada: O método primeiro valida a entrada “hex_string” para garantir que ela contenha apenas caracteres hexadecimais válidos (dígitos 0-9 e letras minúsculas ou maiúsculas A-F). Se a string contiver outros caracteres, será gerado um “ValueError”.
  2. Processamento em Pares: O método processa a string hexadecimal dois caracteres de cada vez, tratando cada par de caracteres como um único byte hexadecimal. Isso significa que para cada dois caracteres na string de entrada, um byte é gerado no objeto “bytes” resultante.
  3. Conversão em Bytes: Cada par de caracteres hexadecimais é convertido em seu equivalente binário.
  4. Construção do Objeto “bytes”: À medida que o método processa os pares de caracteres hexadecimais, ele constrói um objeto “bytes” anexando a representação binária de cada byte. Esse processo continua até que toda a string de entrada tenha sido processada.
  5. Valor de Retorno: Uma vez que toda a string de entrada tenha sido processada, o método retorna o objeto “bytes” resultante, que representa o literal de byte equivalente à string hexadecimal de entrada.

Como exemplo, vamos pegar o valor hex do resultado anterior e usar “fromhex()” para convertê-lo em um literal de byte.

hex_val = "4120717569636b2062726f776e20666f78"

print(bytes.fromhex(hex_val))

Saída:

b'A quick brown fox'

Vamos analisar a string hexadecimal de exemplo “4120717569636b2062726f776e20666f78” para entender melhor como ela é convertida em um literal de byte:

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

Quando todos esses bytes são combinados, você obtém o literal de byte “A quick brown fox”, que é o resultado final.

Use o Módulo “binascii” para Converter Hex em Byte em Python

O módulo Python “binascii” contém funções utilitárias eficientes para operações binárias e ASCII. Em particular, “unhexlify()” é uma função dentro do módulo “binascii” que converte um valor hexadecimal em um literal de byte.

Esta função possui a seguinte sintaxe:

binascii.unhexlify(hex_string)
  • “hex_string”: Este é o argumento obrigatório que representa a string hexadecimal de entrada que você deseja converter em um literal de byte.

Veja uma explicação detalhada de como funciona:

  1. Validação de Entrada: O método começa validando o argumento “hex_string” para garantir que contenha apenas caracteres hexadecimais válidos. Quaisquer caracteres inválidos na string de entrada resultarão em uma exceção “binascii.Error”.
  2. Conversão de Pares Hexadecimais: Em seguida, o método processa a “hex_string” em pares de caracteres. Por exemplo, “41” representa o byte com o valor inteiro 65 (valor ASCII de ‘A’).
  3. Conversão em Bytes: Os pares de bytes hexadecimais são convertidos em sua representação binária. Cada par é transformado em um byte correspondente, sendo que cada caractere representa 4 bits.
  4. Construção do Literal de Byte: Enquanto o método processa cada par, ele adiciona os bytes binários resultantes para formar um literal de byte completo. Esse processo continua até que toda a string de entrada tenha sido processada.
  5. Valor de Retorno: Assim que toda a hex_string tenha sido processada, a função unhexlify() retorna o literal de byte resultante, representado como um objeto bytes.

Vamos inicializar um novo exemplo com caracteres especiais não ASCII, que serão convertidos em um valor hexadecimal. O exemplo será a tradução grega da 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))

Saída:

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'

Agora conseguimos converter com sucesso valores hexadecimais em bytes.

Use o Método codecs.decode() para Converter um Hex em Byte no Python

A função codecs.decode() também pode ser usada para converter uma string hexadecimal em bytes. Ela faz parte do módulo codecs do Python, que fornece várias funcionalidades de codificação e decodificação para diferentes representações de dados.

Ela possui a seguinte sintaxe:

codecs.decode(data, encoding, errors="strict")
  • data: Este é o argumento obrigatório que representa os dados que você deseja decodificar. Neste caso, deve ser a string hexadecimal que você deseja converter em um literal de byte.
  • encoding: Este também é um argumento obrigatório que especifica a codificação a ser usada para a decodificação. Ao trabalhar com strings hexadecimais, você deve usar a codificação hex para indicar que a string de entrada representa um valor hexadecimal.
  • errors (opcional): Este argumento especifica como lidar com erros de decodificação, como quando a string de entrada contém caracteres inválidos para a codificação especificada. Ele tem um valor padrão de strict, mas você pode alterá-lo para ignore ou replace para lidar com erros de forma diferente.

Aqui está uma explicação detalhada de como esse método funciona ao ser usado para decodificar valores hexadecimais:

  1. Validação de Entrada: O método primeiro verifica a validade do argumento data para garantir que ele contenha apenas caracteres hexadecimais válidos. Se a string de entrada contiver caracteres não hexadecimais, ele lançará um erro de UnicodeDecodeError com detalhes sobre o caractere problemático.
  2. Processo de Decodificação: A função codecs.decode() interpreta o argumento data como uma string hexadecimal e a converte em dados binários. Ela processa a string de entrada em pares de caracteres, tratando cada par como um único byte hexadecimal.
  3. Especificação de Codificação: O argumento encoding é crucial nesse contexto. Quando você especifica 'hex' como a codificação, ele indica ao Python que interprete a string de entrada como um valor hexadecimal e o converta de acordo.
  4. Conversão em Bytes: À medida que o método processa cada par de caracteres hexadecimais, ele os converte em sua representação binária. Essa transformação resulta na criação de um literal de byte, onde cada par de caracteres corresponde a um único byte.
  5. Valor de Retorno: O método codecs.decode() retorna o literal de byte resultante como um objeto bytes, representando os dados binários decodificados.

Veja o exemplo abaixo:

import codecs

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

Este programa decodifica a string hex_val usando a função codecs.decode() com o argumento de codificação configurado como 'hex'. Isso significa que ele vai interpretar a string de entrada como um valor hexadecimal e convertê-lo em bytes.

Saída:

b'A quick brown fox'

Utilize a Compreensão de Lista e a Função int() para Converter um Hexadecimal em Byte em Python

Este método envolve o uso da compreensão de lista e da função int() para converter uma string hexadecimal em 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)

Aqui, o código utiliza uma compreensão de lista para iterar sobre a string hexadecimal em pares de dois caracteres, converte cada par em um número inteiro na base 16 (hexadecimal) e cria uma lista desses inteiros.

O construtor bytes() é então usado para converter esta lista de inteiros em um objeto bytes.

Saída:

b'A quick brown fox'

Este método é especialmente útil quando temos uma string hexadecimal com uma estrutura conhecida e queremos convertê-la eficientemente em bytes. Ele fornece controle sobre o processo de conversão, permitindo-nos especificar a base de codificação (neste caso, base 16 para hexadecimal).

Conclusão

Neste artigo, abordamos algumas maneiras de converter valores hexadecimais em literais de bytes em Python.

A função fromhex() é preferível se você não deseja importações adicionais em seu código-fonte. Caso contrário, você pode escolher o método que melhor se adequa às suas necessidades e estilo de programação.