Pythonでソケットを使ったバイナリデータのパッキングとアンパッキング

この記事では、Pythonを使用してソケットでバイナリデータのパッキングとアンパッキングを行う方法について詳しく説明します。具体的なコード例とその解説、応用例を含めています。

目次

はじめに

ソケットプログラミングでは、しばしばバイナリデータの送受信が必要になります。このような場合、データの形式を一定に保つために「パッキング」と「アンパッキング」と呼ばれる処理が行われます。今回はPythonの`struct`モジュールを使用してこれを実現する方法を学びます。

基本的なパッキングとアンパッキング

Pythonでは`struct`モジュールを使用してバイナリデータを扱います。`pack()`と`unpack()`メソッドを使用して、データを固定長のバイナリデータフォーマットに変換できます。

pack()メソッド

`sCode`
# pack()メソッドの使用例
import struct

# int型の3とfloat型の3.14をパッキング
packed_data = struct.pack(‘if’, 3, 3.14)
print(f”パッキング後のデータ: {packed_data}”)

この例では、整数値(int型)3と浮動小数点数(float型)3.14をパッキングしています。`pack`メソッドの第一引数にはフォーマットを指定します。

unpack()メソッド

`sCode`
# unpack()メソッドの使用例
import struct

# パッキングされたデータをアンパッキング
unpacked_data = struct.unpack(‘if’, packed_data)
print(f”アンパッキング後のデータ: {unpacked_data}”)

`unpack()`メソッドを使うと、パッキングされたデータを元に戻すことができます。

ソケットでのデータ送受信

ソケットを用いた通信においても`struct`モジュールは有用です。

サーバー側のコード

`sCode`
import socket
import struct

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((‘localhost’, 12345))
server_socket.listen(1)

conn, addr = server_socket.accept()

# intとfloatをパッキング
packed_data = struct.pack(‘if’, 42, 2.718)
conn.sendall(packed_data)