Decoding bitmask?
Per Gustafsson
per.gustafsson@REDACTED
Wed Dec 21 16:38:45 CET 2005
Hi
The problem is somewhat underspecified. That is do the optional values
all have the same size? What kind of datastructure would you want to
store the result in?
The solution below assumes that all options have the same size and the
results are returned as a list of two tuples where the first element is
the number of the bit that was set and the second element is the value
of that option.
I have not tested the speed of the two different solutions but I suspect
that the second solution is faster, though I feel that the first one is
prettier.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Solution 1 dealing with the bitmask as a binary
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
decode(<<Man1,Man2,BitMask:2/binary,Rest/binary>>) ->
Options = decode_options(BitMask, Rest, 0),
{Man1,Man2,Options}.
decode_options(BitMask, OptBin, N) when N < 16 ->
Pad = 15-N,
case BitMask of
<<_:N,1:1,_:Pad>> ->
<<OptVal,RestOpts/binary>> = OptBin,
[{N+1, OptVal}|decode_options(BitMask,RestOpts,N+1)];
_ ->
decode_options(BitMask,OptBin,N+1)
end;
decode_options(_BitMask, _OptBin, _N) ->
[].
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Solution 2 dealing with the bitmask as an integer
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
decode(<<Man1,Man2,BitMask:16,Rest/binary>>) ->
Options = decode_options(BitMask, Rest, 0),
{Man1,Man2,Options}.
decode_options(BitMask, OptBin, N) when N < 16 ->
Mask = 1 bsl (15-N),
case BitMask band Mask of
X when X > 0 ->
<<OptVal,RestOpts/binary>> = OptBin,
[{N+1, OptVal}|decode_options(BitMask,RestOpts,N+1)];
_ ->
decode_options(BitMask,OptBin,N+1)
end;
decode_options(_BitMask, _OptBin, _N) ->
[].
Ericsson wrote:
> Hello!
>
> I'm working on decoding a binary message. The first variables are Mandatory, so they are easy to decode. The last of the mandatory variables is an 16 bit option mask where each bit corresponds to an optional variable that might follow directly after the OptionMask.
>
> How can I decode this OptionMask, and then parse the optional variables, in the cleanest and most "Erlang optimized" way?
>
> <<Mandatory1, Mandatory2, OptionMask:16/binary, Rest/binary>> = Message,
> etc...
>
> /BE
>
>
> This e-mail and any attachment is for authorised use by the intended recipient(s) only. It may contain proprietary material, confidential information and/or be subject to legal privilege. It should not be copied, disclosed to, retained or used by, any other party. If you are not an intended recipient then please promptly delete this e-mail and any attachment and all copies and inform the sender. Thank you.
>
More information about the erlang-questions
mailing list