5

各要素が2つの整数のタプルであるさまざまな長さの配列を転送する必要があります。例として:

path = [(1,1),(1,2)]
path = [(1,1),(1,2),(2,2)]

パックとアンパックを使用しようとしていますが、配列の長さがさまざまであるため、両方がフォーマットを認識できるようなフォーマットを作成する方法がわかりません。私はそれを次のような区切り文字を含む単一の文字列に変換しようとしていました。

msg = 1&1~1&2~
sendMsg = pack("s",msg) or sendMsg = pack("s",str(msg))

受信側:

path = unpack("s",msg)

ただし、この場合は1を出力するだけです。また、パスを表す余分な文字列を含めない限り、4つの整数を送信しようとしていましたが、これらは正常に送受信されます。

sendMsg = pack( "hhhh"、p.direction [0]、p.direction [1]、p.id、p.health)

受信側:

x,y,id,health = unpack("hhhh",msg)

1つ目は「hhhhs」というフォーマットを送ろうとしていたので説明用でしたが、どちらにしてもパスが正しく通っていません。

ご協力ありがとうございました。また、intの2D配列を送信することも検討しますが、これらのより「複雑な」構造をネットワーク全体に送信する方法がわからないようです。

ご協力ありがとうございました。

4

5 に答える 5

7

パックとアンパックを使用できますが、データの転送にはYAMLJSONなどを使用することをお勧めします。

  • パックとアンパックは、インターフェイスを変更し、異なるバージョンが相互に通信しようとすると、デバッグが困難なエラーや非互換性につながる可能性があります。
  • Pickleはセキュリティ上の問題を引き起こす可能性があり、Pickleの形式はPythonのバージョン間で変わる可能性があります。

JSONは、2.6以降の標準のPythonディストリビューションに含まれています。YAMLにはPyYAMLがあります。

于 2010-03-27T20:53:43.153 に答える
1

ある種のシリアル化プロトコルが必要です。 twisted.spreadそのようなものの1つを提供します(バナナの仕様またはパースペクティブブローカーのドキュメントを参照してください)。JSONまたはプロトコルバッファは、より詳細な例になります。

データシリアル化形式の比較も参照してください。

于 2010-03-27T20:57:03.727 に答える
0

メッセージの一部としてメッセージの長さを含めると、読み取るデータの量がわかります。したがって、文字列全体をネットワーク全体で読み取る必要があります。

いずれにせよ、ネットワークを介してデータを送信するために使用しているコードの一部を投稿したり、少なくとも詳細な説明を提供したりすると、おそらく役立つでしょう。

于 2010-03-27T20:51:03.923 に答える
0

パックとアンパックは必須ですか?そうでない場合は、JSONYAMLを使用できます。

安全ではないのでピクルスを使用しないでください。

于 2010-03-27T20:52:04.517 に答える
0

xdrlibを見てください。役立つかもしれません。これは標準ライブラリの一部であり、次の機能を備えています。

xdrlib モジュールは、Sun Microsystems, Inc. が 1987 年 6 月に作成したRFC 1014に記述されているように、External Data Representation Standard をサポートしています。RFC に記述されているほとんどのデータ型をサポートしています。

于 2010-03-27T21:26:04.600 に答える