2012-06-15 107 views
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個字節是以下消息的長度,其它的字節是消息,
一個空字節終止串。

結果是: **異常錯誤:右側價值
編輯 鄰只匹配給定的代碼之前,有:

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

是否「Reste」爲界?

回答

4

你的代碼沒問題,所以要麼你沒有二進制字符串,要麼Mystring的長度不符合模式。下面是一個簡單的測試:

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

如果你有一個字符串(整數列表),而不是二進制字符串(< <「串」 >>),如文森佐建議,呼籲二郎:list_to_binary/1第一次。

希望它可以幫助

編輯:我檢查你的文森佐的回答評論留下的例子字符串。我用你的代碼試過了,仍然有效。當到達那行代碼時,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"...>> 
+0

是的,現在知道字符串我同意你,它應該是Message_length和Msg模式反彈錯誤。與R15B01(測試)相同的結果。 –

+0

77之後有兩個空值,S三個空值!!?我不明白模式反彈的概念。 – Bertaud

+0

@ Bertaud \ OOO實際上是在尋找3個數字,它們指定一個3位數的八進制數。所以在這種情況下,你有八進制:0,0,052(十進制42)。模式反彈意味着您正嘗試將一個值重新分配給已綁定的變量,如果這些值不完全相同,將導致您提到的錯誤。 – marcelog

0

您必須在要匹配的字符串上調用list_to_binary/1

如果還有其他問題,請輸入example字符串!

+0

-define(S,<<「M \ 0 \ 0 \ 0522039355099,010100000008,0,010170000000,0,0, 0,0,0,0 ,,, 0,0,0110,00,150,0,0,0 \ 0" >>)。 – Bertaud

+0

@Bertaud這是Mystring的內容嗎?你能用這個例子更新這個問題嗎? – marcelog

1

有使用Erlang字符串轉義插值問題。第四個字節不插入爲"\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">>