【Python】エンディアン、2の補数を指定してバイト列(bytes)を整数値(int)に変換する

本記事ではPythonでバイト列をその表現している整数値に変換する方法を紹介します。リトルエンディアン・ビッグエンディアンのいずれでバイト列が表現されていても変換が可能であるほか、バイト列が2の補数で表現されているものとして整数値に変換することも可能です。

リトルエンディアンのバイト列から整数値への変換

bytesからintへの変換にはint.from_bytes関数を使用します。関数は引数にバイト列を示すbytes、エンディアンを示すbyteorder、2の補数表現の有無を示すsignedの3つをとり、bytesとbyteorderの指定は必須です。signedはデフォルトでFalseであり、2の補数でないものとして変換されます。

リトルエンディアン(2の補数でない)で数値40,000を表現するとバイト列は0x409Cです。このバイト列をint値に変換するには以下のようにします。

a = int.from_bytes(b'\x40\x9c', byteorder='little')
print(a)
# a = 40000

リトルエンディアンのバイト列0x409Cが2の補数であると仮定すると、値は40,000-65,536=-25,536となります。この場合は以下のように変換できます。

a = int.from_bytes(b'\x40\x9c', byteorder='little', signed=True)
print(a)
# a = -25536

ビッグエンディアンのバイト列から整数値への変換

ビッグエンディアン(2の補数でない)で数値40,000を表現するとバイト列は0x9C40です。このバイト列からint値への変換は以下のようになります。

a = int.from_bytes(b'\x9c\x40', byteorder='big')
print(a)
# a = 40000

ビッグエンディアンのバイト列0x9C40が2の補数であると仮定すると、値は-25,536です。この場合は以下のように変換できます。

a = int.from_bytes(b'\x9c\x40', byteorder='big', signed=True)
print(a)
# a = -25536

参考リンク

Share - この記事をシェアする