Converter Hex em Byte em Python

Rayven Esplanada 19 setembro 2023
  1. Inicializar um Valor Hexadecimal
  2. Use a Função “bytes.fromhex()” para Converter Hex em Byte em Python
  3. Use o Módulo “binascii” para Converter Hex em Byte em Python
  4. Use o Método codecs.decode() para Converter um Hex em Byte no Python
  5. Utilize a Compreensão de Lista e a Função int() para Converter um Hexadecimal em Byte em Python
  6. Conclusão
Converter Hex em Byte em Python

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.

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

Artigo relacionado - Python Bytes

Artigo relacionado - Python Hex