1. ホーム
  2. python

[解決済み] バイト列をint型に変換するには?

2022-04-24 15:15:30

質問内容

Pythonでバイト列をint型に変換するにはどうしたらいいですか?

このように言ってください。 'y\xcc\xa6\xbb'

賢い・バカな方法を思いついた。

sum(ord(c) << (i * 8) for i, c in enumerate('y\xcc\xa6\xbb'[::-1]))

もっと簡単にできるビルトインや標準ライブラリがあるはずなんですが......。

とは異なります。 16進数の文字列を変換する の場合は、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

言うまでもなく、1回のインポートでこのメソッドを大量に実行するのであれば、この問題は比例して小さくなります。また、CPUというよりi/oコストでしょうから、特定のマシンの容量や負荷特性に依存するかもしれません。

解決方法は?

を使用することもできます。 構造体 モジュールで行うことができます。

>>> struct.unpack("<L", "y\xcc\xa6\xbb")[0]
3148270713L