Python 2 および Python 3 で Int をバイトに変換する方法
int
から bytes
への変換は、最後の HowTo チュートリアルで紹介されている bytes
から int
への変換 の逆の操作です。この記事で紹介した int-to-bytes
メソッドのほとんどは、bytes-to-int
メソッドの逆のメソッドです。
Python 2.7 および 3 での int
から bytes
への変換の一般的な方法
Python struct モジュールのpack
関数を使用して、整数を特定の形式のバイトに変換できます。
>>> import struct
>>> struct.pack("B", 2)
'\x02'
>>> struct.pack(">H", 2)
'\x00\x02'
>>> struct.pack("<H", 2)
'\x02\x00'
struct.pack
関数の最初の引数は、バイト長、符号、バイト順(リトルエンディアンまたはビッグエンディアン)などのバイト形式を指定する形式文字列です。
Python 3 のみ int
から bytes
変換メソッド
bytes
を使用して int
を bytes
に変換する
前回の記事で示したように、bytes
は Python 3 の組み込みデータ型です。bytes
を使って整数 0〜255 をバイトデータ型に簡単に変換できます。
>>> bytes([2])
b'\x02'
整数は括弧で囲む必要があります。そうしないと、対応するバイト自体ではなく、整数バイトの位置を占める空きバイトになります。
>>> bytes(3)
b'\x00\x00\x00'
int.to_bytes()
メソッドを使用して変換 int
を bytes
に変換する
Python 3.1 から、新しい整数クラスメソッド int.to_bytes()
が導入されました。これは、前回の記事で説明した int.from_bytes()
の逆変換方法です。
>>> (258).to_bytes(2, byteorder="little")
b'\x02\x01'
>>> (258).to_bytes(2, byteorder="big")
b'\x01\x02'
>>> (258).to_bytes(4, byteorder="little", signed=True)
b'\x02\x01\x00\x00'
>>> (-258).to_bytes(4, byteorder="little", signed=True)
b'\xfe\xfe\xff\xff'
最初の引数は変換されたバイトデータ長であり、2 番目の引数 byteorder
はバイトオーダーをリトルエンディアンまたはビッグエンディアンに定義し、オプションの引数 signed
は 2 の補数を使用して整数を表すかどうかを決定します。
性能比較
Python 3 では、int
を bytes()
に変換する 3つの方法があります。
bytes()
方法struct.pack()
方法int.to_bytes()
方法
各メソッドの実行時間を確認してパフォーマンスを比較し、最後にプログラムの速度を改善するための提案を行います。
>>> import timeint
>>> timeit.timeit('bytes([255])', number=1000000)
0.31296982169325455
>>> timeit.timeit('struct.pack("B", 255)', setup='import struct', number=1000000)
0.2640925447800839
>>> timeit.timeit('(255).to_bytes(1, byteorder="little")', number=1000000)
0.5622947660224895
変換方法 | 実行時間(100 万回) |
---|---|
bytes() |
0.31296982169325455 秒 |
struct.pack() |
0.2640925447800839 秒 |
int.to_bytes() |
0.5622947660224895 秒 |
そのため、struct.pack()
関数を使用して int
からバイトへの変換を実行し、Python 2 で既に導入されていますが、最高の実行パフォーマンスを取得してください。