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
- Convertendo Bytes para Inteiros em Python 2.7
- Python 3 e o Tipo
bytes
- Convertendo Bytes para Inteiros em Python 3
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.