fix: hexstr_to_bin support half byte

This commit is contained in:
EMQ-YangM 2022-05-17 16:28:39 +08:00
parent 636626f65f
commit d8da8f1686
2 changed files with 18 additions and 1 deletions

View File

@ -326,7 +326,20 @@ int2hexchar(I, lower) -> I - 10 + $a.
-spec hexstr_to_bin(binary()) -> binary(). -spec hexstr_to_bin(binary()) -> binary().
hexstr_to_bin(B) when is_binary(B) -> hexstr_to_bin(B) when is_binary(B) ->
<<<<(hexchar2int(H) * 16 + hexchar2int(L))>> || <<H:8, L:8>> <= 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 ->
<<BH:((Size - 8) div 8)/binary, BL: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))>> || <<H:8, L:8>> <= B>>.
hexchar2int(I) when I >= $0 andalso I =< $9 -> I - $0; hexchar2int(I) when I >= $0 andalso I =< $9 -> I - $0;
hexchar2int(I) when I >= $A andalso I =< $F -> I - $A + 10; hexchar2int(I) when I >= $A andalso I =< $F -> I - $A + 10;

View File

@ -171,6 +171,10 @@ t_term_encode(_) ->
). ).
t_hexstr2bin(_) -> 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(<<1, 2>>, emqx_rule_funcs:hexstr2bin(<<"0102">>)),
?assertEqual(<<17, 33>>, emqx_rule_funcs:hexstr2bin(<<"1121">>)). ?assertEqual(<<17, 33>>, emqx_rule_funcs:hexstr2bin(<<"1121">>)).