Python 2.7とPython 3におけるバイトの扱いは大きく異なります。この記事では、両バージョンにおけるバイトから整数への変換方法を説明し、重要な違いを強調します。
目次
Python 2.7とバイト文字列
Python 2.7では、str
型がテキストデータとバイトデータの両方を扱います。Python 3にあるような専用のbytes
型はありません。バイト文字列は、本質的にバイト値を表す文字のシーケンスです。Python 2.7は正式に非推奨となっており、新規プロジェクトでは使用すべきではないことを覚えておくことが重要です。
Python 2.7でのバイトから整数への変換
単一バイトを整数に変換するには、ord()
関数を使用します。
byte_string = 'A' # 'A'のバイト値を表す
integer_value = ord(byte_string)
print(integer_value) # 出力: 65
ord()
はUnicodeコードポイントを返し、単一バイトの場合はバイトの数値と一致します。より長いバイト文字列の場合は、より大きな整数に変換するためにビット操作が必要です。次の例はリトルエンディアンのバイト順序を想定しています。
byte_string = 'x01x02x03' # バイト文字列の例(リトルエンディアン)
integer_value = 0
for byte in byte_string:
integer_value = (integer_value << 8) | ord(byte)
print(integer_value) # 出力: 66051
これは、整数を8ビット左シフトし、ビットごとのOR演算を適用して各バイトを取り込むことを繰り返します。ビッグエンディアンの場合は、繰り返しを逆順にします。
Python 3とbytes
型
Python 3では、bytes
型が明示的に導入され、str
型(Unicodeテキスト)から分離されています。bytes
オブジェクトは、0から255までの整数の変更不可能なシーケンスです。
Python 3でのバイトから整数への変換
Python 3では、よりクリーンなアプローチが提供されています。単一バイトの場合:
byte_data = b'x41' # バイトリテラルを示す'b'プレフィックスに注意
integer_value = byte_data[0]
print(integer_value) # 出力: 65
インデックス0のバイトに直接アクセスすることで、整数値が得られます。複数のバイトの場合は、int.from_bytes()
を使用して、バイト順序(エンディアンネス)を指定します。
byte_data = b'x01x02x03' # リトルエンディアンの例
integer_value = int.from_bytes(byte_data, byteorder='little')
print(integer_value) # 出力: 66051
byte_data = b'x01x02x03' # ビッグエンディアンの例
integer_value = int.from_bytes(byte_data, byteorder='big')
print(integer_value) # 出力: 16909060
byteorder='little'
は最下位バイトが先、byteorder='big'
は最上位バイトが先を意味します。移植性を確保するために常にbyteorder
を指定してください。指定しない場合、システムのデフォルトが使用されます。