Bir bayt dizesini python'da int'e nasıl dönüştürebilirim?
Böyle söyle: 'y\xcc\xa6\xbb'
Bunu yapmanın akıllıca / aptalca bir yolunu buldum:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Yerleşik veya standart kütüphanede bunu daha basit yapan bir şey olması gerektiğini biliyorum ...
Bu, int (xxx, 16) kullanabileceğiniz onaltılık basamak dizesini dönüştürmekten farklıdır , ancak bunun yerine gerçek bayt değerleri dizesini dönüştürmek istiyorum.
GÜNCELLEME:
James'in biraz daha iyi cevap vermesini seviyorum, çünkü başka bir modül almayı gerektirmiyor, ancak Greg'in yöntemi daha hızlı:
>>> 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
Benim hacky yöntemi:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
DAHA FAZLA GÜNCELLEME:
Birisi yorumlarda başka bir modülü içe aktarmayla ilgili sorunun ne olduğunu sordu. Bir modülü içe aktarmak mutlaka ucuz değil, bir göz atın:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
Modülü içe aktarma maliyetini dahil etmek, bu yöntemin sahip olduğu avantajın neredeyse tamamını ortadan kaldırır. Bunun, tüm kıyaslama çalışması için yalnızca bir kez içe aktarma masrafını içereceğine inanıyorum; her seferinde yeniden yüklemeye zorladığımda ne olduğuna bakın:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Söylemeye gerek yok, bir içe aktarma başına bu yöntemin çok sayıda yürütme yapıyorsanız, bu oranla daha az sorun olur. Ayrıca, cpu yerine muhtemelen i / o maliyeti olduğundan, belirli bir makinenin kapasitesine ve yük özelliklerine bağlı olabilir.
int.from_bytes) struct.unpackbilgisayarımda gerçekleştirildi . Daha okunabilir imo olmanın yanında.