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

  • MrRandomSong

    MrRandomSong

    29 Kasım 2009
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008
  • WoodysGamertag

    WoodysGamert

    17 Aralık 2009