diff --git a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl index 07d6597c3..735025e2b 100644 --- a/apps/emqx_rule_engine/src/emqx_rule_funcs.erl +++ b/apps/emqx_rule_engine/src/emqx_rule_funcs.erl @@ -96,6 +96,8 @@ bytesize/1, subbits/2, subbits/3, + subbits/4, + subbits/5, subbits/6 ]). @@ -556,6 +558,16 @@ subbits(Bits, Len) when is_integer(Len), is_bitstring(Bits) -> subbits(Bits, Start, Len) when is_integer(Start), is_integer(Len), is_bitstring(Bits) -> get_subbits(Bits, Start, Len, <<"integer">>, <<"unsigned">>, <<"big">>). +subbits(Bits, Start, Len, Type) when + is_integer(Start), is_integer(Len), is_bitstring(Bits) +-> + get_subbits(Bits, Start, Len, Type, <<"unsigned">>, <<"big">>). + +subbits(Bits, Start, Len, Type, Signedness) when + is_integer(Start), is_integer(Len), is_bitstring(Bits) +-> + get_subbits(Bits, Start, Len, Type, Signedness, <<"big">>). + subbits(Bits, Start, Len, Type, Signedness, Endianness) when is_integer(Start), is_integer(Len), is_bitstring(Bits) -> diff --git a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl index 358cca3fe..3bdfaa5b4 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -911,6 +911,17 @@ t_subbits2_float(_) -> ct:pal(";;;;~p", [R2]), ?assert((RL2 >= 0 andalso RL2 < 0.0001) orelse (RL2 =< 0 andalso RL2 > -0.0001)). +t_subbits_4_args(_) -> + R = apply_func(subbits, [<<5.3:64/float>>, 1, 64, <<"float">>]), + RL = (5.3 - R), + ?assert((RL >= 0 andalso RL < 0.0001) orelse (RL =< 0 andalso RL > -0.0001)). + +t_subbits_5_args(_) -> + ?assertEqual( + 456, + apply_func(subbits, [<<456:32/integer>>, 1, 32, <<"integer">>, <<"unsigned">>]) + ). + %%------------------------------------------------------------------------------ %% Test cases for Hash funcs %%------------------------------------------------------------------------------