2

バイナリ文字列から 2 つのフィールドを分割しようとしました。

-define(S,<<"M\0\0\0522039355099,010100000008,0,010170000000,0,0,0,0,0,0,,,0,0,,‌​0110,00,150,0,0,0\0">>).<<Message_length:4/binary,Msg/binary>> = S.

最初の 4 バイトは次のメッセージの長さで、残りのバイトはメッセージです
。null バイトは文字列を終了します。

結果は次のとおりです: ** exception error: o match of right hand side value
EDIT 与えられたコードの直前に:

[Sequence|Reste] = binary:split(T,<<"\0">>),

「レスト」は有界ですか?

4

3 に答える 3

4

コードは問題ないので、バイナリ文字列がないか、Mystring の長さがパターンに準拠していません。簡単なテストは次のとおりです。

1> Mystring = <<"abcde">>.
<<"abcde">>
2> <<Message_length:4/binary,Msg/binary>> = Mystring.
<<"abcde">>
3> Message_length.
<<"abcd">>
4> Msg.
<<"e">>

Vincenzo が提案したように、バイナリ文字列 (<<"string">>) の代わりに文字列 (整数のリスト) がある場合は、最初に erlang:list_to_binary/1 を呼び出します。

それが役に立てば幸い

編集:Vincenzoの回答のコメントに残した文字列の例を確認しました。あなたのコードで試してみましたが、まだ動作します。そのコード行に到達したときに、Message_length および/または Msg が既にバインドされている (そして Mystring とは異なる) 可能性はありますか? これにより、パターン マッチングが失敗します。

EDIT2:質問の更新されたデータでテストされました:

1> S = <<"M\0\0\0522039355099,010100000008,0,010170000000,0,0,0,0,0,0,,,0,0,,\342\200\214\342\200\2130110,00,150,0,0,0\0">>.
<<77,0,0,42,50,48,51,57,51,53,53,48,57,57,44,48,49,48,49,
  48,48,48,48,48,48,48,56,44,48,...>>
2> <<Message_length:4/binary,Msg/binary>> = S.
<<77,0,0,42,50,48,51,57,51,53,53,48,57,57,44,48,49,48,49,
  48,48,48,48,48,48,48,56,44,48,...>>
3> Message_length.
<<77,0,0,42>>
4> Msg.
<<"2039355099,010100000008,0,010170000000,0,0,0,0,0,0,,,0,0,,\342"...>>
于 2012-06-15T15:33:49.140 に答える
1

Erlang 文字列エスケープ補間に問題があります。4 番目のバイトは補間されません"\0"が、"\052".

1> Bin = <<"M\0\0\0522039355099,010100000008,0,010170000000,0,0,0,0,0,0,,,0,0,,0110,00,150,0,0,0\0">>.
<<77,0,0,42,50,48,51,57,51,53,53,48,57,57,44,48,49,48,49,                                                                                                                     
  48,48,48,48,48,48,48,56,44,48,...>>

したがって、このように記述する必要があります。

2> f().
ok
3> Bin = <<"M\0\0\0","522039355099,010100000008,0,010170000000,0,0,0,0,0,0,,,0,0,,0110,00,150,0,0,0\0">>.
<<77,0,0,0,53,50,50,48,51,57,51,53,53,48,57,57,44,48,49,
  48,49,48,48,48,48,48,48,48,56,...>>

次に、この形式のメッセージを解析する通常の方法は次のとおりです。

4> <<L:32/little,Rest/binary>> = Bin.
<<77,0,0,0,53,50,50,48,51,57,51,53,53,48,57,57,44,48,49,
  48,49,48,48,48,48,48,48,48,56,...>>
5> L.
77
6> <<Msg:L/binary,R/binary>> = Rest.
<<"522039355099,010100000008,0,010170000000,0,0,0,0,0,0,,,0,0,,0110,00,150,0,0,0"...>>
7> R.
<<0>>
8> Msg.
<<"522039355099,010100000008,0,010170000000,0,0,0,0,0,0,,,0,0,,0110,00,150,0,0,0">>
于 2012-06-15T22:43:20.383 に答える
0

list_to_binary/1照合するには文字列を呼び出す必要があります。

さらに問題がある場合は、examplestringを入力してください。

于 2012-06-15T15:31:19.530 に答える