Python Programming

Python 2.7と3でのバイトから整数への変換

Spread the love

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を指定してください。指定しない場合、システムのデフォルトが使用されます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です