Pythonのstructモジュールを使ってバイナリデータをパック(エンコード)およびアンパック(デコード)する方法を解説します。この記事では、structモジュールの基本的な使用方法から、さまざまなデータ型での処理、そして応用例までを網羅しています。
目次
structモジュールとは
Pythonの標準ライブラリに含まれるstructモジュールは、バイナリデータを扱う際に非常に便利なツールです。主にC言語とのインターフェースで用いられることが多く、Cのstructと同様のデータ構造をPythonで扱うことができます。
基本的な使用方法
structモジュールを使用する基本的な方法は`pack`関数と`unpack`関数を使用することです。以下はその基本形です。
pack関数
import struct
# int型とfloat型をパックする
packed_data = struct.pack('if', 4, 7.0)
このコードでは、整数(int)と浮動小数点数(float)をパックしています。第一引数の`’if’`がフォーマット文字列であり、それぞれのデータ型に対応しています。
unpack関数
import struct
# バイナリデータをアンパックする
unpacked_data = struct.unpack('if', packed_data)
`unpack`関数は、パックされたバイナリデータを元のデータに戻します。`pack`関数で使用したフォーマット文字列と同じものを使用する必要があります。
応用例
1. ファイルのバイナリ読み書き
ファイルにバイナリデータを保存し、後で読み出す例です。
with open('data.bin', 'wb') as f:
f.write(packed_data)
with open('data.bin', 'rb') as f:
data = f.read()
unpacked_data = struct.unpack('if', data)
2. ネットワーク通信
ソケットを使った簡単なサーバーとクライアントの通信でstructモジュールを使用する例です。
import socket
# サーバー
with socket.socket() as s:
s.bind(('localhost', 12345))
s.listen(1)
conn, addr = s.accept()
data = conn.recv(1024)
unpacked_data = struct.unpack('if', data)
# クライアント
with socket.socket() as s:
s.connect(('localhost', 12345))
s.sendall(packed_data)
3. バージョン情報の埋め込み
ソフトウェアのバージョン情報をバイナリデータとして埋め込む例です。
VERSION_MAJOR = 1
VERSION_MINOR = 0
version_packed = struct.pack('BB', VERSION_MAJOR, VERSION_MINOR)
def check_version(data):
major, minor = struct.unpack('BB', data)
return major, minor
まとめ
structモジュールは、Pythonでバイナリデータを簡単に扱うための強力なツールです。基本的な`pack`と`unpack`の使用方法から、応用例までを紹介しました。これを機に、structモジュールを使いこなして、より高度なデータ処理を行ってみてはいかがでしょうか。
コメント