From d8da8f16860aa710ff322a0425face40de5ad5ad Mon Sep 17 00:00:00 2001 From: EMQ-YangM Date: Tue, 17 May 2022 16:28:39 +0800 Subject: [PATCH] fix: hexstr_to_bin support half byte --- apps/emqx/src/emqx_misc.erl | 15 ++++++++++++++- .../test/emqx_rule_funcs_SUITE.erl | 4 ++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/apps/emqx/src/emqx_misc.erl b/apps/emqx/src/emqx_misc.erl index d34ab47e1..9a16f7107 100644 --- a/apps/emqx/src/emqx_misc.erl +++ b/apps/emqx/src/emqx_misc.erl @@ -326,7 +326,20 @@ int2hexchar(I, lower) -> I - 10 + $a. -spec hexstr_to_bin(binary()) -> binary(). hexstr_to_bin(B) when is_binary(B) -> - <<<<(hexchar2int(H) * 16 + hexchar2int(L))>> || <> <= B>>. + hexstr_to_bin(B, erlang:bit_size(B)). + +hexstr_to_bin(B, Size) when is_binary(B) -> + case Size rem 16 of + 0 -> + make_binary(B); + 8 -> + <> = B, + <<(make_binary(BH))/binary, <<(hexchar2int(BL) * 16)>>/binary>>; + _ -> + throw({unsupport_hex_string, B, Size}) + end. + +make_binary(B) -> <<<<(hexchar2int(H) * 16 + hexchar2int(L))>> || <> <= B>>. hexchar2int(I) when I >= $0 andalso I =< $9 -> I - $0; hexchar2int(I) when I >= $A andalso I =< $F -> I - $A + 10; 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 5b27e3efa..0514fc0e9 100644 --- a/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl +++ b/apps/emqx_rule_engine/test/emqx_rule_funcs_SUITE.erl @@ -171,6 +171,10 @@ t_term_encode(_) -> ). t_hexstr2bin(_) -> + ?assertEqual(<<99, 100, 240>>, emqx_rule_funcs:hexstr2bin(<<"6364f">>)), + ?assertEqual(<<160>>, emqx_rule_funcs:hexstr2bin(<<"a">>)), + ?assertEqual(<<240>>, emqx_rule_funcs:hexstr2bin(<<"f">>)), + ?assertEqual(<<80>>, emqx_rule_funcs:hexstr2bin(<<"5">>)), ?assertEqual(<<1, 2>>, emqx_rule_funcs:hexstr2bin(<<"0102">>)), ?assertEqual(<<17, 33>>, emqx_rule_funcs:hexstr2bin(<<"1121">>)).