Como posso converter uma sequência de bytes em um int em python?
Diga assim: 'y\xcc\xa6\xbb'
Eu vim com uma maneira inteligente / estúpida de fazer isso:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Eu sei que tem que haver algo embutido ou na biblioteca padrão que faça isso de forma mais simples ...
Isso é diferente de converter uma sequência de dígitos hexadecimais para a qual você pode usar int (xxx, 16), mas, em vez disso, desejo converter uma sequência de valores reais de bytes.
ATUALIZAR:
Eu meio que gosto da resposta de James um pouco melhor porque não requer a importação de outro módulo, mas o método de Greg é mais rápido:
>>> from timeit import Timer
>>> Timer('struct.unpack("<L", "y\xcc\xa6\xbb")[0]', 'import struct').timeit()
0.36242198944091797
>>> Timer("int('y\xcc\xa6\xbb'.encode('hex'), 16)").timeit()
1.1432669162750244
Meu método hacky:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
ATUALIZAÇÃO ATUALIZADA:
Alguém perguntou nos comentários qual é o problema com a importação de outro módulo. Bem, importar um módulo não é necessariamente barato, dê uma olhada:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
A inclusão do custo de importação do módulo nega quase toda a vantagem que esse método possui. Acredito que isso incluirá apenas as despesas de importação uma vez durante toda a execução do benchmark; veja o que acontece quando eu o forço a recarregar toda vez:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Desnecessário dizer que, se você estiver executando muitas execuções desse método por importação, isso se tornará proporcionalmente menos problemático. Provavelmente, também é um custo de E / S em vez de CPU, por isso pode depender das características de capacidade e carga de uma máquina específica.
int.from_bytes
) foi superada struct.unpack
no meu computador. Além de ser mais legível, imo.