Python解析可変長構造

最近、Cからのデータパケットを解析するためにPythonを使用する必要があるというリクエストを受け取りました。データパケットの形式は、次の構造で定義されています。

typedef struct msg_t
{
 int oid;
 int msg_len;
 char msg_data[0];}MSG_T;

msg_data文字列の長さは msg_lenで指定されるため、最初に msg_lenの値を解析してから、 msg_lenの内容を読み取る必要があります。

この操作は、Pythonのstructモジュールを介して実行できます。上記のデータ構造のpython解析コードは次のとおりです。

  OID =0
 msgLen =0
 msgData =""
 sFormat =""

 OID, msgLen = struct.unpack('II', syncMsg[0:8])
 sFormat ='II'+str(msgLen)+'s'
 OID, msgLen, msgData = struct.unpack(sFormat, syncMsg)
 msgData = msgData.decode()
 # print("OID: ", OID,"\nMsgLen: ", msgLen,"\nMsgData: ", msgData.decode())

コードのコアは、 unpackの場合の単一引用符部分です。ここで、 IIntを表し、 128sは長さ128の文字列を表します。ここでは、最初に長さを分析し、次にデータ形式を接続して分析します。

**struct **でサポートされている形式は次のとおりです。

フォーマット Cタイプ Python バイト
x pad byte no value 1
c char string of length 1 1
b signed char integer 1
B unsigned char integer 1
? _ Bool bool 1
h short integer 2
H unsigned short integer 2
i int integer 4
I(大文字のi) unsigned int integerまたはlong 4
l(小文字のL) long integer 4
L unsigned long long 4
q long long long 8
Q unsigned long long long 8
f float float 4
d double float 8
s char[] string 1
p char[] string 1
P void * long 4

参照##


Author: Frytea
タイトル:Pythonによる可変長構造の解析
Link: https://blog.frytea.com/archives/453/
Copyright: This work by TL-Song is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Recommended Posts

Python解析可変長構造
pythonデータ構造
Pythonの一般的なデータ構造の照合
Pythonのデータ構造とアルゴリズム
Python変数スコープとは
Python変数スコープの詳細な理解