2012-06-15 104 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">>