1

1 つの null バイトで区切られたメッセージで構成されるバイナリ文字列を考えてみましょう:

<message><null><message><null> ... <message><null>

それらを分割したいと思います。簡単に、私はします:

binary:split(Bin,<<0>>,[global]),

しかし...
しかし、1つのメッセージは2つの部分で構成されています:

<length><texte>

length には 4 バイトの固定サイズがあり、長さには null バイトを含めることができます。
その場合、分割機能は文字列を正しくカットできません。
アーランの最先端技術による方法は存在しますか?

4

1 に答える 1

5

すべてのメッセージに 4 バイト長のヘッダーがある場合は、erlang:decode_packet(Type,Bin,Options)whereTypeを に設定して使用することをお勧めし4ます。これにより、最初のメッセージがどこにあり、残りのバイナリが{ok, Message, Rest}どこにあるかが返されます。バイナリの最後に到達するまで、洗い流して繰り返します (間にある null バイトを自分で処理する必要がある場合があります)。MessageRest

ただし、すべてのメッセージが 4 バイト長のプレフィックスを持っているわけではなく、そのヘッダーを検出する決定論的な方法がない場合、そのようなリストを確実に解析することはおそらく不可能です。

于 2012-06-16T12:44:06.443 に答える