Python バイトを整数に変換する方法

胡金庫 2023年1月30日
  1. Python 2.7 バイト Bytes
  2. Python 3 のバイト
Python バイトを整数に変換する方法

Bytes データ型の値の範囲は 0〜255(0x00〜0xFF)です。1 バイトには 8 ビットがあるため、最大値は 0xFF です。状況によっては、バイトまたはバイト配列をさらにデータ処理するために整数に変換する必要があります。この記事では、バイトを整数に変換する方法を紹介します。

Python 2.7 バイト Bytes

Python 2.7 バージョンには組み込みの bytes データ型はありません。キーワード bytestr と同じです。

>>> bytes is str
True

bytearraybytes または byte array を定義するために使用されます。

>>> byteExample1 = bytearray([1])
>>> byteExample1
bytearray(b'\x01')
>>> byteExample2 = bytearray([1,2,3])
>>> byteExample2
bytearray(b'\x01\x02\x03')

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

Python 内部モジュール struct は、バイナリデータ(バイト)を整数に変換できます。Python 2.7 ではバイトまたは実際に文字列を、双方向では整数に変換できます。

`struct.unpack(fmt, string)`
    Convert the string according to the given format `fmt` to integers. The result is a tuple even if there is only one item inside.

struct の例

import struct

testBytes = b"\x00\x01\x00\x02"
testResult = struct.unpack(">HH", testBytes)
print testResult
(1, 2)

フォーマット文字列 >HH には 2つの部分が含まれます。

  1. > は、バイナリデータが big-endian であることを示します。つまり、データはビッグエンド(最上位ビット)から並べられます。たとえば、\x00\0x1 では \x00 は上位バイトで、\x01 が下位バイトです。
  2. HH は、バイト文字列に H タイプの 2つのオブジェクトがあることを意味します。H は、2 バイトを占める unsigned short 整数であることを示します。

割り当てられたデータ形式が異なる場合、同じ文字列から異なる結果が得られる可能性があります。

>>> testResult = struct.unpack('<HH', testBytes)
>>> testResult
(256, 512)

ここで、< はエンディアンが little-endian であることを示します。したがって、\x00\x010*256+1 = 1 ではなく、00+1*256 = 256 になります。

>>> testResult = struct.unpack('<BBBB', testBytes)
>>> testResult
(0, 1, 0, 2)

B はデータが unsigned char であることを示し、1 バイトを占有します。したがって、\x00\x01\x00\x02 は 2 の unsigned short 値ではなく、4 の unsigned char 値に変換されます。

警告
フォーマット文字列で表されるデータ長は、指定されたデータと同じでなければなりません。そうでない場合、エラー報告されます。
>>> testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')

Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    testResult = struct.unpack('<BBB', b'\x00\x01\x00\x02')
error: unpack requires a string argument of length 3

struct モジュールの公式ドキュメントをチェックして、フォーマット文字列 の詳細情報を取得できます。

Python 3 のバイト

bytes は Python 3 の組み込みデータ型であるため、bytes キーワードを使用して直接バイトを定義できます。

>>> testByte = bytes(18)
>>> type(testByte)

以下のように、バイトまたはバイト配列を直接定義することもできます。

>>> testBytes = b'\x01\x21\31\41'
>>> type(testBytes)

Python 3 でバイトを整数に変換する

Python 2.7 で既に導入されている struct モジュールに加えて、新しい Python 3 組み込み整数メソッドを使用して、バイトから整数への変換、つまり int.from_bytes() メソッドを実行することもできます。

int.from_bytes()

>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big')
61712

この byteorder オプションは、struct.unpack() バイト順の定義のフォーマットに似ています。

Info
バイト表現は 1つの整数に変換されます。

int.from_bytes() は 3 番目の signed オプションがある、整数型を signed または unsigned に割り当てます。

>>> testBytes = b'\xF1\x10'
>>> int.from_bytes(testBytes, byteorder='big', signed=True)
-3824

バイトが unsigned chart の場合に [] を使用する

データの形式が unsigned char である、1 バイトのみを含む場合は、オブジェクトインデックスを直接使用してアクセスし、データの整数を取得することもできます。

>>> testBytes = b'\xF1\x10'
>>> testBytes[0]
241
>>> testBytes[1]
16
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - Python Bytes