Skip to content

Instantly share code, notes, and snippets.

@cleverfox
Created April 9, 2018 20:45
Show Gist options
  • Save cleverfox/59cda4f1864be59b38639980a391ce83 to your computer and use it in GitHub Desktop.
Save cleverfox/59cda4f1864be59b38639980a391ce83 to your computer and use it in GitHub Desktop.
hex.erl
-module(hex).
-export([encode/1, decode/1]).
-export([parse/1]).
parse(B) -> decode(B).
decode(B) when is_binary(B) ->
decode(binary_to_list(B));
decode([$0, $x|L]) ->
decode(L);
decode(L) when is_list(L) ->
case length(L) rem 2 of
0 -> ok;
1 -> throw('bad_length')
end,
decode(string:to_lower(L), <<>>).
decode([], Acc) ->
Acc;
decode([H1, H2|Rest], Acc) ->
decode(Rest, <<Acc/binary, ((h2i(H1) bsl 4) bor h2i(H2))/integer>>).
h2i($0) -> 0;
h2i($1) -> 1;
h2i($2) -> 2;
h2i($3) -> 3;
h2i($4) -> 4;
h2i($5) -> 5;
h2i($6) -> 6;
h2i($7) -> 7;
h2i($8) -> 8;
h2i($9) -> 9;
h2i($a) -> 10;
h2i($b) -> 11;
h2i($c) -> 12;
h2i($d) -> 13;
h2i($e) -> 14;
h2i($f) -> 15;
h2i(Any) -> throw({'bad_symbol', Any}).
encode(List) when is_list(List) ->
encode(list_to_binary(List),<<>>);
encode(B) when is_binary(B) ->
encode(B, <<>>).
-define(H(X), (hex(X)):16).
encode(<<>>, Acc) -> Acc;
encode(<<X:8, Rest/binary>>, Acc) ->
encode(Rest, <<Acc/binary, ?H(X)>>).
-compile({inline, [hex/1]}).
hex(X) ->
element(
X+1, {16#3030, 16#3031, 16#3032, 16#3033, 16#3034, 16#3035, 16#3036,
16#3037, 16#3038, 16#3039, 16#3041, 16#3042, 16#3043, 16#3044,
16#3045, 16#3046, 16#3130, 16#3131, 16#3132, 16#3133, 16#3134,
16#3135, 16#3136, 16#3137, 16#3138, 16#3139, 16#3141, 16#3142,
16#3143, 16#3144, 16#3145, 16#3146, 16#3230, 16#3231, 16#3232,
16#3233, 16#3234, 16#3235, 16#3236, 16#3237, 16#3238, 16#3239,
16#3241, 16#3242, 16#3243, 16#3244, 16#3245, 16#3246, 16#3330,
16#3331, 16#3332, 16#3333, 16#3334, 16#3335, 16#3336, 16#3337,
16#3338, 16#3339, 16#3341, 16#3342, 16#3343, 16#3344, 16#3345,
16#3346, 16#3430, 16#3431, 16#3432, 16#3433, 16#3434, 16#3435,
16#3436, 16#3437, 16#3438, 16#3439, 16#3441, 16#3442, 16#3443,
16#3444, 16#3445, 16#3446, 16#3530, 16#3531, 16#3532, 16#3533,
16#3534, 16#3535, 16#3536, 16#3537, 16#3538, 16#3539, 16#3541,
16#3542, 16#3543, 16#3544, 16#3545, 16#3546, 16#3630, 16#3631,
16#3632, 16#3633, 16#3634, 16#3635, 16#3636, 16#3637, 16#3638,
16#3639, 16#3641, 16#3642, 16#3643, 16#3644, 16#3645, 16#3646,
16#3730, 16#3731, 16#3732, 16#3733, 16#3734, 16#3735, 16#3736,
16#3737, 16#3738, 16#3739, 16#3741, 16#3742, 16#3743, 16#3744,
16#3745, 16#3746, 16#3830, 16#3831, 16#3832, 16#3833, 16#3834,
16#3835, 16#3836, 16#3837, 16#3838, 16#3839, 16#3841, 16#3842,
16#3843, 16#3844, 16#3845, 16#3846, 16#3930, 16#3931, 16#3932,
16#3933, 16#3934, 16#3935, 16#3936, 16#3937, 16#3938, 16#3939,
16#3941, 16#3942, 16#3943, 16#3944, 16#3945, 16#3946, 16#4130,
16#4131, 16#4132, 16#4133, 16#4134, 16#4135, 16#4136, 16#4137,
16#4138, 16#4139, 16#4141, 16#4142, 16#4143, 16#4144, 16#4145,
16#4146, 16#4230, 16#4231, 16#4232, 16#4233, 16#4234, 16#4235,
16#4236, 16#4237, 16#4238, 16#4239, 16#4241, 16#4242, 16#4243,
16#4244, 16#4245, 16#4246, 16#4330, 16#4331, 16#4332, 16#4333,
16#4334, 16#4335, 16#4336, 16#4337, 16#4338, 16#4339, 16#4341,
16#4342, 16#4343, 16#4344, 16#4345, 16#4346, 16#4430, 16#4431,
16#4432, 16#4433, 16#4434, 16#4435, 16#4436, 16#4437, 16#4438,
16#4439, 16#4441, 16#4442, 16#4443, 16#4444, 16#4445, 16#4446,
16#4530, 16#4531, 16#4532, 16#4533, 16#4534, 16#4535, 16#4536,
16#4537, 16#4538, 16#4539, 16#4541, 16#4542, 16#4543, 16#4544,
16#4545, 16#4546, 16#4630, 16#4631, 16#4632, 16#4633, 16#4634,
16#4635, 16#4636, 16#4637, 16#4638, 16#4639, 16#4641, 16#4642,
16#4643, 16#4644, 16#4645, 16#4646}).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment