Python Programming

Convertendo Bytes para Inteiros em Python 2.7 e 3

Spread the love

O tratamento de bytes em Python difere significativamente entre Python 2.7 e Python 3. Este artigo esclarece como converter bytes em inteiros em ambas as versões, enfatizando as distinções cruciais.

Sumário

Python 2.7 e Strings de Bytes

Em Python 2.7, o tipo str lida com dados de texto e bytes. Um tipo bytes dedicado, como encontrado no Python 3, está ausente. Strings de bytes são essencialmente sequências de caracteres representando valores de bytes. É importante lembrar que o Python 2.7 está oficialmente depreciado e não deve ser usado para novos projetos.

Convertendo Bytes para Inteiros em Python 2.7

Converter bytes únicos para inteiros é feito com a função ord():


byte_string = 'A'  # Representa o valor em byte de 'A'
integer_value = ord(byte_string)
print(integer_value)  # Saída: 65

ord() fornece o ponto de código Unicode, que corresponde ao valor numérico do byte para bytes únicos. Para strings de bytes mais longas, a manipulação de bits é necessária para convertê-las em inteiros maiores. O exemplo a seguir assume a ordem de bytes little-endian:


byte_string = 'x01x02x03' # Exemplo de string de bytes (little-endian)
integer_value = 0
for byte in byte_string:
    integer_value = (integer_value << 8) | ord(byte)
print(integer_value) # Saída: 66051

Isso iterativamente desloca o inteiro para a esquerda em 8 bits e aplica um OR bit a bit para incorporar cada byte. Para a ordem big-endian, inverta a iteração.

Python 3 e o Tipo bytes

O Python 3 introduz explicitamente o tipo bytes, separando-o do tipo str (texto Unicode). Os objetos bytes são sequências imutáveis de inteiros variando de 0 a 255.

Convertendo Bytes para Inteiros em Python 3

O Python 3 oferece uma abordagem mais limpa. Para um único byte:


byte_data = b'x41' # Observe o prefixo 'b' indicando literal de bytes
integer_value = byte_data[0]
print(integer_value)  # Saída: 65

Acessar diretamente o byte no índice 0 fornece o valor inteiro. Para vários bytes, int.from_bytes() é usado, especificando a ordem dos bytes (endianness):


byte_data = b'x01x02x03' # Exemplo little-endian
integer_value = int.from_bytes(byte_data, byteorder='little')
print(integer_value)  # Saída: 66051

byte_data = b'x01x02x03' # Exemplo big-endian
integer_value = int.from_bytes(byte_data, byteorder='big')
print(integer_value)  # Saída: 16909060

byteorder='little' significa o byte menos significativo primeiro, enquanto byteorder='big' indica o byte mais significativo primeiro. Sempre especifique byteorder para portabilidade; caso contrário, o padrão do sistema é usado.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *