バイト文字列を int に変換するにはどうすればいいですか? 質問する

バイト文字列を int に変換するにはどうすればいいですか? 質問する

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) を使用することもできますが、代わりに実際のバイト値の文字列を変換したいと思います。

アップデート:

別のモジュールをインポートする必要がないので、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

モジュールをインポートするコストを含めると、この方法の利点のほとんどすべてが無効になります。これには、ベンチマーク実行全体で 1 回のインポートのコストのみが含まれると考えています。毎回強制的に再ロードするとどうなるか見てみましょう。

>>> Timer("""reload(struct)\nstruct.unpack(">L", "y\xcc\xa6\xbb")[0]""", 'import struct').timeit()
68.474128007888794

言うまでもなく、1 回のインポートごとにこのメソッドを多数実行する場合、この問題は比例して少なくなります。また、これは CPU ではなく I/O コストである可能性が高いため、特定のマシンの容量と負荷特性に依存する可能性があります。

ベストアンサー1

Python 3.2以降では、

>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='big')
2043455163

または

>>> int.from_bytes(b'y\xcc\xa6\xbb', byteorder='little')
3148270713

によるエンディアンバイト文字列の。

これは、任意の長さのバイト文字列整数や、 を指定することで2の補数の符号付き整数にも適用できますsigned=Trueドキュメントfrom_bytes

おすすめ記事