1

私はPythonの基本的なネットワークプロトコルに取り組んでいます。これは、ASCII文字列(読み取り:EOLで終了)とバイナリデータの両方を転送できるはずです。後者を可能にするために、バイナリになるバイト数が含まれるように文法を作成することにしました。

SimpleParseの場合、これまでの文法は次のようになります[1]。

EOL := [\n]
IDENTIFIER := [a-zA-Z0-9_-]+
SIZE_INTEGER := [1-9]*[0-9]+
ASCII_VALUE := [^\n\0]+, EOL
BINARY_VALUE := .*+
value := (ASCII_VALUE/BINARY_VALUE)

eol_attribute := IDENTIFIER, ':', value
binary_attribute := IDENTIFIER, [\t], SIZE_INTEGER, ':', value
attributes := (eol_attribute/binary_attribute)+ 

command := IDENTIFIER, EOL
command := IDENTIFIER, '{', attributes, '}'

問題は、以下が実行時にSIZE_INTEGERバイトのバイナリデータのチャックになることをSimpleParseに指示する方法がわからないことです。

この原因は、現在の私のニーズを満たすターミナルBINARY_VALUEの定義であるため、変更できません。

ありがとう

編集

ソリューションは、本番のbinary_attributeと一致したときに停止し、ASTノードに手動で(socket.recv()を介して)データを入力するように指示していると思いますが、それを行うにはどうすればよいですか?

編集2

Base64エンコーディングなどはオプションではありません。

[1]私はそれをテストしていないので、それが実際に機能するかどうかはわかりません。アイデアを得るのはあなただけです。

4

3 に答える 3

4

文法が引用したものと同じくらい単純な場合、おそらくパーサジェネレータを使用するのはやり過ぎですか?独自の再帰パーサーを手作業でローリングする方が簡単で迅速であることに気付くかもしれません。

于 2009-10-21T09:59:28.587 に答える
1

アプリケーションの移植性と信頼性を高めたい場合は、標準のASCII文字のみをネットワーク経由で渡すことをお勧めします。

コンピュータアーキテクチャが異なれば、バイナリ表現、単語サイズ、文字セットも異なります。これに対処するには3つのアプローチがあります。

まず、問題を無視して、単一のパルトフォームにプロトコルを実装するだけでよいことを願っています。

2つは、すべてのコンピューターの能力を活用して、CORBAの可能なデータ型ごとに「基本的な形式」を考え出すことができます。

実用的で、「sprintf」と「scanf」の魔法を使用して、ネットワーク経由でデータを送信するときに、プレーンASCII文字との間でデータを変換できます。

また、プロトコルにメッセージの先頭またはその近くにメッセージの長さを含めることをお勧めします。自家製のプロトコルで最も一般的なバグは、受信側のパートナーが送信されたよりも多くのデータを期待し、その後、送信されなかったデータを永久に待機することです。

于 2009-10-27T01:55:42.580 に答える
0

バイナリデータの解析にコンストラクトライブラリの使用を検討することを強くお勧めします。また、テキスト(ASCII)もサポートしているため、テキストを検出すると、それをSimpleParseベースのパーサーに渡すことができますが、バイナリデータは構文解析されます。とても便利でパワフルです。

于 2009-10-24T06:11:01.933 に答える