最近、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
の場合の単一引用符部分です。ここで、 I
は Int
を表し、 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.