我想将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/integer
或PN: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}}">>}