这是解析标头的方法:
-module(bitcnt).
-export([parse_header/1]).
parse_header(Message) ->
parse_header(Message, []).
parse_header(<<0:1, 0:1, Body/bitstring>>, Header) ->
%% stop if found header delimiter - two consecutive zero bits
%% return parsed header and message body
{lists:reverse(Header), Body};
parse_header(<<1:1, Rest/bitstring>>, []) ->
%% handle if first bit is '1'
parse_header(Rest, [1]);
parse_header(<<1:1, Rest/bitstring>>, [H | T]) ->
%% handle consecutive '1' bits of header
parse_header(Rest, [H+1 | T]);
parse_header(<<0:1, Rest/bitstring>>, Header) ->
%% handle delimiters inside header - '0' bit
parse_header(Rest, [0 | Header]).
让我们在shell中测试它。假设这样的标题'10110111'(必须解析为[1,2,3])+分隔符'00'+一些主体<<12345:64>>:
2> B1 = <<1:1,0:1,1:1,1:1,0:1,1:1,1:1,1:1,0:1,0:1,12345:64>>.
<<183,0,0,0,0,0,0,12,14,1:2>>
3>
3> bitcnt:parse_header(B1).
{[1,2,3],<<0,0,0,0,0,0,48,57>>}
4>
4> <<12345:64>>.
<<0,0,0,0,0,0,48,57>>
另一个测试'11101'(必须解析成[3,1])+'00'+<<12345:64>>
5> B2 = <<1:1, 1:1, 1:1, 0:1, 1:1, 0:1, 0:1, 12345:64>>.
<<232,0,0,0,0,0,0,96,57:7>>
6>
6> bitcnt:parse_header(B2).
{[3,1],<<0,0,0,0,0,0,48,57>>}
即使标头为空(消息以两个连续的零位开头) - 函数将标头解析为空列表:
7> B3 = <<0:1, 0:1, 12345:64>>.
<<0,0,0,0,0,0,12,14,1:2>>
8>
8> bitcnt:parse_header(B3).
{[],<<0,0,0,0,0,0,48,57>>}
附言
顺便说一句,您的标题格式非常多余。如果您想编码大数字,例如数字 1024 - 您需要将其转换为 1024 个连续的“1”位!
有两种方法可以改善标题格式: