如何在 erlang 二进制文件中解析元组、整数和字符串?



我想将IP地址,端口号和自定义内容放在二进制文件中,对整数进行二进制匹配,但是我找不到方法。

假设IP地址IP = {192,168,1,1},端口号PN = 10000,自定义内容Content = <<"{request, {M, F, A}}">>,我可以用Bin = <<list_to_binary(tuple_to_list(IP))/binary, Content/binary, PN/integer>>把它们全部放成二进制,二进制结果是

<<127,0,0,1,123,114,101,113,117,101,115,116,44,32,123,77,
44,32,70,44,32,65,125,125,16>>

但是当我尝试对端口号 (PN) 进行二进制匹配时,它会转向其他内容 (16),我如何处理整数并将其大小保持在二进制中为 1?

二进制匹配为:<<A:4/binary, B:20/binary, C>> = Bin。C 的结果是 16,而不是 10000。

我想问的另一个问题是如何限制数据包的大小?是否可以在不考虑数据包内容长度的情况下限制数据包大小?妥协还是切成几块?

您至少需要 14 位来表示数字 10000。一种方法是:

Bin = << IPBin/binary, Content/binary, PN:14/integer-unit:1>>.

这将导致二进制文件:

<<192,168,1,1,123,114,101,113,117,101,115,116,44,32,123,
77,44,32,70,44,32,65,125,125,156,16:6>>

然后可以按如下方式匹配它:

<<A:4/binary, B:20/binary, C:14/integer-unit:1>> = Bin.

希望这能为位语法的段提供一些启示

注意:您将需要 2 个字节来表示任何端口号,因此PN:16/integerPN:16/unsigned会更好。

如果端口号是二进制文件的最后一部分,并且是已知其他所有内容的大小,则可以使用integer_to_binary(PN)并将此值附加到二进制文件。

然后,您必须使用binary_to_integer(C)进行相反的情况,即 C 通过模式匹配提取。

3> IP = {192,168,1,1}, PN = 10000, Content = <<"{request, {M, F, A}}">>.
<<"{request, {M, F, A}}">>
4> Encode = fun({A, B, C, D}, PN, Content) -> <<A, B, C, D, PN:16/unsigned, Content/bytes>> end.
#Fun<erl_eval.18.50752066>
5> Decode = fun(<<A, B, C, D, PN:16/unsigned, Content/bytes>>) -> {{A, B, C, D}, PN, Content} end.
#Fun<erl_eval.6.50752066>
6> V = Encode(IP, PN, Content).
<<192,168,1,1,39,16,123,114,101,113,117,101,115,116,44,32,
123,77,44,32,70,44,32,65,125,125>>
7> Decode(V).
{{192,168,1,1},10000,<<"{request, {M, F, A}}">>}

最新更新