Pythonでstructモジュールを使ってバイナリデータをパック・アンパックする方法

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モジュールを使いこなして、より高度なデータ処理を行ってみてはいかがでしょうか。

コメント

コメントする

目次