Bagaimana saya bisa mengubah string byte menjadi int di python?
Katakan seperti ini: 'y\xcc\xa6\xbb'
Saya datang dengan cara pintar / bodoh untuk melakukannya:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
Saya tahu harus ada sesuatu bawaan atau di perpustakaan standar yang melakukan ini lebih sederhana ...
Ini berbeda dengan mengonversi string angka hex yang dapat Anda gunakan int (xxx, 16), tetapi saya ingin mengonversi string nilai byte aktual.
MEMPERBARUI:
Saya agak suka jawaban James sedikit lebih baik karena tidak perlu mengimpor modul lain, tetapi metode Greg lebih cepat:
>>> 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
Metode hacky saya:
>>> Timer("sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))").timeit()
2.8819329738616943
PEMBARUAN LEBIH LANJUT:
Seseorang bertanya dalam komentar apa masalah dengan mengimpor modul lain. Nah, mengimpor modul belum tentu murah, lihat:
>>> Timer("""import struct\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""").timeit()
0.98822188377380371
Termasuk biaya mengimpor modul meniadakan hampir semua keuntungan yang dimiliki metode ini. Saya percaya bahwa ini hanya akan mencakup biaya impor sekali untuk seluruh proses benchmark; lihat apa yang terjadi ketika saya memaksanya memuat ulang setiap kali:
>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794
Tak perlu dikatakan, jika Anda melakukan banyak eksekusi metode ini per satu impor daripada ini menjadi kurang proporsional masalah. Ini juga mungkin biaya i / o daripada cpu sehingga mungkin tergantung pada kapasitas dan karakteristik beban mesin tertentu.
int.from_bytes
) tampil struct.unpack
di komputer saya. Selanjutnya menjadi imo yang lebih mudah dibaca.