ฉันจะแปลงสตริงไบต์เป็น int ในไพ ธ อนได้อย่างไร
พูดอย่างนี้: 'y\xcc\xa6\xbb'
ฉันคิดวิธีที่ฉลาด / โง่ขึ้นมา:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
ฉันรู้ว่าต้องมีบางสิ่งในตัวหรือในห้องสมุดมาตรฐานที่ทำสิ่งนี้ได้ง่ายกว่า ...
ซึ่งแตกต่างจากการแปลงสตริงของตัวเลขฐานสิบหกซึ่งคุณสามารถใช้ int (xxx, 16) ได้ แต่ฉันต้องการแปลงสตริงของค่าไบต์จริงแทน
UPDATE:
ฉันชอบคำตอบของ James ที่ดีขึ้นเล็กน้อยเพราะไม่ต้องการนำเข้าโมดูลอื่น แต่วิธีของ Greg เร็วขึ้น:
>>> 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
วิธีแฮ็คของฉัน:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
อัพเดทเพิ่มเติม:
มีคนถามความคิดเห็นว่ามีปัญหาอะไรกับการนำเข้าโมดูลอื่น การอิมพอร์ตโมดูลนั้นไม่จำเป็นว่าจะราคาถูกลองดู:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
รวมถึงค่าใช้จ่ายในการนำเข้าโมดูลทำให้เกิดความได้เปรียบเกือบทั้งหมดจากวิธีนี้ ฉันเชื่อว่าสิ่งนี้จะรวมถึงค่าใช้จ่ายในการนำเข้าหนึ่งครั้งสำหรับการวัดประสิทธิภาพทั้งหมด ดูสิ่งที่เกิดขึ้นเมื่อฉันบังคับให้โหลดซ้ำทุกครั้ง:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
ไม่จำเป็นต้องพูดว่าหากคุณทำการประมวลผลจำนวนมากของวิธีนี้ต่อหนึ่งการนำเข้าซึ่งจะทำให้เกิดปัญหาน้อยลงตามสัดส่วน อาจเป็นค่าใช้จ่ายของ i / o มากกว่า cpu ดังนั้นจึงอาจขึ้นอยู่กับความจุและลักษณะของโหลดของเครื่องนั้น ๆ
int.from_bytes
) ทำออกมาstruct.unpack
ในคอมพิวเตอร์ของฉัน ถัดจากการเป็น IMO ที่อ่านง่ายขึ้น