bir int içine bayt dizesi (python)dönüştürmek
Nasıl python ile bir int içine bayt dize dönüştürebilirsiniz?
Bu şöyle: 'y\xcc\xa6\xbb'
Bunu yapmanın zeki/aptal bir yol ile geldi:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Bir şey olmak için yerleşik var biliyorum veya standart kütüphanede bu daha basit
Bu, int kullanabilirsiniz converting a string of hex digits, 16 xxx () farklıdır, ama bunun yerine gerçek bayt değerleri bir dize dönüştürmek istiyorum.
GÜNCELLEME:
Ben James'in başka bir modül alma gerektirmez, ama Greg için, bu yöntem daha hızlı olduğu için biraz daha iyi bir cevap . sanki
>>> 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
Hacky benim yöntem:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
DİĞER GÜNCELLEME:
Birisi başka bir modül alma ile sorun nedir yorum istedi. Peki, bir modül alma 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 alma bedeli de dahil olmak üzere bu yöntem olduğunu avantajı hemen hemen tüm olumsuzlar. Bu sadece bir kez tüm kriter çalıştırmak için alma pahasına vardır; her seferinde yeniden zorluyorum ne olur: bak inanıyorum
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Eğer bu oldu daha bir tane al başına bu yöntemin idamlar çok yapıyorsan söylemeye gerek yok, orantılı olarak daha az sorun. Özellikle makinenin kapasitesi ve yük özelliklerine bağlıdır; bu nedenle de muhtemelen cpu yerine g/Ç mal oldu.
CEVAP
Python ve daha sonra 3.2 kullanın
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='big')
2043455163
ya
>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='little')
3148270713
bayt dize senin endianness göre.
Bu da-tamsayılar örneğini oluşturur bytestring herhangi bir uzunluktaki için çalışıyor, ve iki-tamamlayıcı signed=True
belirterek, imzalı tamsayı. docs for from_bytes
bkz.
Python bir dize bayt dönüştürmek...
Bayt içine Java Dize dönüştürmek için ...
En iyi Python 3 bayt dize dönüştürmek ...
Nasıl Java bayt içine int dönüştürmek ...
Python - yerel datetime UTC tarih dize...