SORU
14 Ocak 2009, ÇARŞAMBA


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
9 Mart 2012, Cuma


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Charles Griffin Gibson

    Charles Grif

    26 NİSAN 2006
  • Harvest: Greg Laurie

    Harvest: Gre

    6 HAZİRAN 2006
  • RealPapaPit

    RealPapaPit

    16 Mart 2009