HOWTO · Python

Converter Hex String em Int em Python

Demonstra como converter hexadecimais para inteiros em Python

Este tutorial demonstrará como converter a string hexadecimal para int em Python. Cobrirá diferentes formatos hexadecimais como assinado, pequeno, e big-endian, 0x hexadecimal anotado, e a string hexadecimal padrão.

Utilize int() para Converter Hex para Int em Python

A forma mais comum e eficaz de converter o hexágono num número inteiro em Python é utilizar a função de tipografia int().

Esta função aceita dois argumentos: um argumento obrigatório, que é o valor a ser convertido, e um segundo argumento opcional, que é a base do formato do número com o padrão como 10.

Outros formatos de números são 2 para binário, 8 para octal, e 16 para hexadecimal. Se colocar 0 como argumento para o valor base, obterá o formato do número a partir do prefixo do valor. Se não houver nenhum prefixo, reconhecê-lo-á automaticamente como decimal, 0b para binário, 0o para octal, e 0x para hexadecimal.

Converter Hex String Não Prefixado em Int em Python

Se a string hexadecimal não for prefixada, então especificar o valor base da função int() a ser 16.

Por exemplo:

hex_val = "beef101"

print(int(hex_val, 16))

Resultado:

200208641

O resultado é a conversão decimal ou inteira do valor hexadecimal beef101.

Conversão de Hex String Prefixado em Int em Python

Se a string hexagonal tiver um prefixo 0x, então altere o argumento do valor base para 0 para detectar automaticamente o prefixo.

Ainda pode passar 16 como base, mas se estiver a lidar com múltiplos valores com diferentes formatos de números, passar 0 é a melhor abordagem.

hex_val = "0xdeadcab"

print(int(hex_val, 0))
print(int(hex_val, 16))

Resultado:

233495723
233495723

Converter string hexadecimal de Little e Big Endian em Int em Python

(https://betterexplained.com/articles/understanding-big-and-little-endian-byte-order/) são dois tipos de sistemas de encomenda de hexadecimal. A ordem padrão é little-endian, o que coloca o número mais significativo na parte mais à direita da sequência, enquanto o big-endian faz o oposto.

Com isto em mente, tudo o que temos de considerar é converter o valor hexadecimal do big-endian em little-endian. Posteriormente, a conversão habitual pode agora ser efectuada sobre ele.

Para converter uma string hexadecimal big-endiana em hexadecimal little-endian, utilizar bytearray.fromhex() e utilizar a função reverse() sobre o resultado. Depois, converta o valor hexadecimal de volta para string e converta-o para um número inteiro.

big_endian = "efbe"


def to_little(val):
    little_hex = bytearray.fromhex(val)
    little_hex.reverse()
    print("Byte array format:", little_hex)

    str_little = "".join(format(x, "02x") for x in little_hex)

    return str_little


little_endian = to_little(big_endian)

print("Little endian hex:", little_endian)
print("Hex to int:", int(little_endian, 16))

Para resumir este bloco de código:

  • Chamar bytearray.fromhex() para converter a string hexadecimal big-endian em um valor hexadecimal de array de bytes.
  • Inverter a matriz de bytes para converter o big-endian para um formato little-endian.
  • Converter o valor do array de bytes de volta para um formato de string hexadecimal em formato little-endian.
  • Converter a string num número inteiro utilizando int().

Resultado:

Byte array format: bytearray(b'\xbe\xef')
Little endian hex: beef
Hex to int: 48879

Converter o Hex para Inteiro Assinado em Python

A conversão de qualquer formato numérico num inteiro assinado necessitaria de uma operação chamada Complemento de Dois, que é uma operação matemática um pouco mais abrangente para calcular para números assinados.

Assim, antes de podermos converter o hexadecimal num inteiro assinado, precisaríamos de definir uma função que realizasse a operação do Complemento de Dois.

def twosComplement_hex(hexval):
    bits = 16  # Number of bits in a hexadecimal number format
    val = int(hexval, bits)
    if val & (1 << (bits - 1)):
        val -= 1 << bits
    return val

O bit mais à esquerda num valor binário é chamado bit assinado, determinando se o inteiro é positivo ou negativo. Esta função irá reservar esse bit como bit assinado e deslocar os outros bits para compensar utilizando o operador de deslocamento à esquerda do bit <<.

Agora, passando à conversão real do valor hexadecimal para int. assinado.

hex_val1 = "ff"
hex_val2 = "ffff"
hex_val3 = "aaff"


def twosComplement_hex(hexval):
    bits = 16
    val = int(hexval, bits)
    if val & (1 << (bits - 1)):
        val -= 1 << bits
    return val


print(twosComplement_hex(hex_val1))
print(twosComplement_hex(hex_val2))
print(twosComplement_hex(hex_val3))

Resultado:

255
-1
-21761

Agora, conseguimos converter uma string hexadecimais num inteiro assinado.

Em resumo, cobrimos a conversão de diferentes tipos de formatos hexadecimais em números inteiros assinados e não assinados. Utilize int() com o valor e argumentos de base para converter um hexadecimal em um inteiro não assinado.

Se o hexadecimal estiver num formato big-endian, converta-o num formato little-endian utilizando primeiro bytearray.fromhex() e reverse().

Por último, se precisar de converter uma string hexadecimal para um inteiro assinado, então execute a operação Complementar de Dois sobre o valor hexadecimal nele para obter um valor inteiro assinado.