Pythonでバイト文字列をintに変換するにはどうすればよいですか?
このように言います: 'y\xcc\xa6\xbb'
私はそれを行うための賢い/愚かな方法を思いつきました:
sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))
私はこれをより簡単に行う組み込みまたは標準ライブラリにある必要があることを知っています...
これは、int(xxx、16)を使用できる16進数の文字列の変換とは異なりますが、実際のバイト値の文字列を変換したいと思います。
更新:
別のモジュールをインポートする必要がないので、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
言うまでもなく、1回のインポートでこのメソッドを多数実行している場合は、比例して問題が少なくなります。また、特定のマシンの容量と負荷特性に依存する可能性があるため、CPUよりもI / Oコストになる可能性があります。
int.from_bytes
)が優れstruct.unpack
ています。次はもっと読みやすいimoです。