Converter Hex String em Int em Python

  1. Utilize int() para Converter Hex para Int em Python
  2. Converter Hex String Não Prefixado em Int em Python
  3. Conversão de Hex String Prefixado em Int em Python
  4. Converter string hexadecimal de Little e Big Endian em Int em Python
  5. Converter o Hex para Inteiro Assinado 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 matriz 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.

Artigo relacionado - Python Hex

  • Converter Byte em Hex em Python
  • Artigo relacionado - Python Integer

  • Converter Byte em Hex em Python
  • Converter Hex em Byte em Python