Cデータの逆シリアル化

deserialization networking python udp
Cデータの逆シリアル化

ネットワーク経由でCサーバーからPythonクライアントに構造体を受け取ります。 プロトコルはUDPです。 私はサーバーとそのプロトコル/データ形式を制御できません。 次の構造体で構成されます(はい、IPv4 +ポート):

struct ip_s {
    uint8_t i1;
    uint8_t i2;
    uint8_t i3;
    uint8_t i4;
    uint16_t port; // big endian
};

ビッグエンディアンに変換されるポートとは別に、データは「そのまま」送信され、 `(char *)`にキャストされます。

Pythonで処理可能な形式のこの構造体を受け取るにはどうすればよいですか?

” ” ‘

その他の情報:

  • Python 2.7または3.x

  • クロスプラットフォーム

  • できれば組み込みモジュールのみを使用したソリューション

  3  0


ベストアンサー

struct.unpackを調べてください。

それはおそらくこのように見えるでしょう:

# socket setup

(buffer, sockaddress) = mysocket.recvfrom(6)
if len(buffer)== 6:
    i1,i2,i3,i4, port = struct.unpack('!BBBBH', buffer)

3


_
ネットワーク経由で構造体を受信して​​います
_

すぐそこで止まります。 しないでください。 この手法により、次の依存関係が導入されます。

  1. 語順:ビッグエンディアンまたはリトルエンディアン。

  2. パディング

  3. 梱包。

(2)および(3)は、次の条件に依存します。

  1. コンパイラ

  2. コンパイラーのバージョン。

  3. 周囲の#pragmas。

  4. Cプログラムがコンパイルされたときに有効なコンパイラオプション。

それはかなり多くの依存関係です。 しないでください。 アプリケーションプロトコルを定義して使用します。 または、問題を解決するXDRなどを使用します。

0


タイトルとURLをコピーしました