KUMICO

COLUMN

組み込みエンジニアの戸惑い Pythonでバイナリデータを扱う

組み込みソフトウェアエンジニアがPythonを始めてみました。そして、第3の戸惑い、今回はPythonでのバイナリデータの扱い方についてまとめていきたいと思います。

使用するデータ型
Pythonでバイナリを扱う上で使用するデータ型が2つあります。前回のコラム「組み込みエンジニアの戸惑い:Pythonのデータ型をまとめる」でも紹介した bytesbytearray です。この2つのデータ型の大きな違いは、immutable(変更不可)か mutable(変更可)かなので、データを書き換えるかそうでないかでどちらを使用するべきかが分かります。

>>> x = b’abc’
>>> x[0] = 98
Traceback (most recent call last):
    File “<stdin>”, line 1, in <module>
TypeError: ‘bytes’ object does not support item assignment

>>> y = bytearray(b’abc’)
>>> y[0] = 98
>>> print(y)
bytearray(b’bbc’)

bytesの使い方は、x = ‘abc’と宣言すると、xに文字列としてabcが格納されます、この先頭にbを追加しx = b’abc’と宣言することで、xにバイナリデータとして文字列abcが格納されます。x = bytes(b’abc’)と記述することもできますが、同様の結果となります。また、immutableなので要素を更新しようとするとエラーが発生します。
bytearrayの使い方は、bytearray()を使用して記述し、上の例では文字列abcをバイナリとして格納しています。また、mutableなので各要素を更新することが可能です。

簡単なバイナリデータの書き込み
上記のデータ型だけでは使い方はいまいちピンときていないかと思います。各種ファイルヘッダなどのバイナリデータをファイルに書き込みたい時や、通信パケットのフォーマットに合わせたデータを作成したい時、有効な方法はいくつかありますが、はじめにbytearrayのリストを使ったデータ作成方法をご紹介します。

>>> x = bytearray([0x41, 0x42, 0x43])
>>> print(x)
bytearray(b’ABC’)

>>> x.append(0x44)
>>> print(x)
bytearray(b’ABCD’)

>>> x.extend([0x45, 0x46, 0x47])
>>> print(x)
bytearray(b’ABCDEFG’)

bytearrayの宣言にはリストも使用することができます。このbytearrayで作成したバイナリデータのリストに対し、appendメソッドを使うことで、リストの最後に指定したデータを追加することができます。また、extendメソッドを使うことで、リストの最後に指定したリストを追加することも可能です。

structモジュールを使った読み書き
続いては、C言語の構造体などで定義された複雑なデータを扱う際に有効なstructモジュールをご紹介します。

>>> import struct
>>> x = struct.pack(‘bxhl’, 1, 2, 3)
>>> print(x)
b’¥x01¥x00¥x02¥x00¥x03¥x00¥x00¥x00′

>>> y = struct.unpack(‘bxhl’, x)
>>> print(y)
(1, 2, 3)

データを作成する場合は、pack()を使用します。第一引数にデータフォーマットを指定し、その後に入力したいデータを指定します。
逆にデータを各要素に分ける場合は、unpack()を使用します。pack()と同様に第一引数はデータフォーマットを指定し、第二引数に元となるデータを指定します。
注意点としては、C言語と同様にパディングが発生するので、データずれなどで悩まされた場合にはデータフォーマットを見直してみてください。
また、データの一部のみを読み込みたい場合にはunpack_from()という関数も用意されていますので、用途に合わせ使ってみてください。

バイナリデータの高速読み込み
画像ファイルや音声ファイルなど大容量のデータをバイナリから配列に変換する場合、データを読み込むだけでも一苦労、そんな時に有効なバイナリデータの高速読み込みを可能とするnumpyモジュール。バイナリを扱う以外にも、機能盛り沢山なモジュールなので、次回の戸惑いでご紹介したいと思います。

次回、「Pythonでnumpyを使ってみる」の巻。

個別相談も承っております。下記よりお申し込みください。

個別相談会申し込み

シリーズ記事

関連記事

OTHER COLUMN

MORE  

まこちゃんブログ

NEWS

MORE  

PARTNER

  • Intel
  • Xilinx

お探しの組み込み製品はキーワードで検索!