バイナリデータ配列をまとめて数値配列に変換したいときのコード。
別のページでバイナリ配列を丸ごと整数1個に変換する方法を記載しているが、実際にはある程度まとまったデータを一度に変換したいケースが多いと思う。
センサデータだったり、シリアル通信して独自のパケットを解釈したりなど…etc
from_bytesとリスト内包表記を使うコード例
# バイナリ配列を定義
binary_data = b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03'
# バイナリデータを2バイトごとにスライスし、整数に変換してリストに追加
size = 2
int_list = [int.from_bytes(binary_data[i:i+size], byteorder='big', signed=True) for i in range(0, len(binary_data), size)]
print("Integer List:", int_list) # 整数のリストを出力
実行結果
Integer List: [0, 1, 0, 2, 0, 3]
バイナリデータをsize
変数に指定したサイズ(ここでは2バイト)ごとにスライスし、それぞれのスライスを符号付き整数に変換してリストに追加している。
このままだとバイナリデータの長さがスライスサイズで割り切れない場合、最後のスライスはサイズが足りなくなる可能性がある。
実際に使う場合は、バイナリデータの長さが指定されたサイズで割り切れることを確認するなど異常系を追加すること。
struct モジュールを使用してを使うコード例
import struct
# バイナリ配列を定義
binary_data = b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x00\x00\x03'
# 4バイト整数のパターンにマッチする文字列を解析し、整数のリストを取得
int_list = struct.unpack(f">{len(binary_data) // 4}i", binary_data)
print("Integer List:", int_list) # 整数のリストを出力
実行結果
Integer List: (1, 2, 3)
このコードは、struct.unpack()
関数を使用して、整数のタプルを返す操作を行っている。
具体的には、バイナリデータを4バイトごとに整数に変換し、その整数を含むタプルを返す。f">{len(binary_data) // 4}i"
というフォーマット文字列は、ビッグエンディアンで解釈される4バイトの整数を指定している。
ここで使っている指定子
'>'
: ビッグエンディアンを指定する指示子。{len(binary_data) // 4}
: バイナリデータの長さを4で割った整数値を指定している。これは、バイナリデータ内の4バイト整数の数を表す。'i'
: 符号付き整数を表す。4バイトの整数を解析対象とする。