Comment puis-je convertir une chaîne d'octets en un entier en python?
Dis comme ça: 'y\xcc\xa6\xbb'
J'ai trouvé une façon intelligente / stupide de le faire:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Je sais qu'il doit y avoir quelque chose de intégré ou dans la bibliothèque standard qui fait cela plus simplement ...
Ceci est différent de la conversion d'une chaîne de chiffres hexadécimaux pour laquelle vous pouvez utiliser int (xxx, 16), mais je souhaite plutôt convertir une chaîne de valeurs d'octets réelles.
METTRE À JOUR:
J'aime un peu mieux la réponse de James car elle ne nécessite pas d'importer un autre module, mais la méthode de Greg est plus rapide:
>>> 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
Ma méthode hacky:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
AUTRE MISE À JOUR:
Quelqu'un a demandé dans les commentaires quel était le problème lors de l'importation d'un autre module. Eh bien, importer un module n'est pas forcément bon marché, jetez un œil:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
Le fait d'inclure le coût d'importation du module annule presque tous les avantages de cette méthode. Je pense que cela n'inclura que les frais de son importation une fois pour toute la période de référence; regardez ce qui se passe quand je le force à se recharger à chaque fois:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Inutile de dire que si vous effectuez beaucoup d'exécutions de cette méthode par importation, cela devient proportionnellement moins problématique. C'est aussi probablement un coût d'E / S plutôt qu'un CPU, donc cela peut dépendre de la capacité et des caractéristiques de charge de la machine particulière.
int.from_bytes
) a surpassé struct.unpack
sur mon ordinateur. En plus d'être plus lisible imo.