diff options
Diffstat (limited to 'src/tlv.erl')
-rw-r--r-- | src/tlv.erl | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/tlv.erl b/src/tlv.erl index b1d3428..fec016b 100644 --- a/src/tlv.erl +++ b/src/tlv.erl @@ -3,22 +3,37 @@ -module(tlv). --export([encode/2, decode/1]). +-export([encode/2, decode/1, encodelist/1, decodelist/1]). -spec encode(binary(), binary()) -> binary(). -encode(Type, Value) -> - 4 = byte_size(Type), % FIXME: make Type a 4 octet binary +encode(Type, Value) when byte_size(Type) == 4 -> Len = byte_size(Value) + 8, - <<Len:32, Type/binary, Value/binary>>. + <<Len:32, Type:4/binary, Value/binary>>. -spec decode(binary()) -> {binary(), binary(), binary()}. decode(Data) -> <<TotalLength:32, Rest1/binary>> = Data, Length = TotalLength - 8, - <<Type:4/binary-unit:8, Rest2/binary>> = Rest1, - <<Value:Length/binary-unit:8, Rest3/binary>> = Rest2, + <<Type:4/binary, Rest2/binary>> = Rest1, + <<Value:Length/binary, Rest3/binary>> = Rest2, {Type, Value, Rest3}. +%% Convenience functions + +-spec encodelist([{binary(), binary()}]) -> binary(). +encodelist(List) -> + list_to_binary([encode(Type, Value) || {Type, Value} <- List]). + +-spec decodelist(binary()) -> [{binary(), binary()}]. +decodelist(Data) -> + decodelist(Data, []). + +decodelist(<<>>, Acc) -> + lists:reverse(Acc); +decodelist(Data, Acc) -> + {Type, Value, Rest} = decode(Data), + decodelist(Rest, [{Type, Value} | Acc]). + %%%%%%%%%%%%%%%%%%%% -include_lib("eunit/include/eunit.hrl"). @@ -32,3 +47,13 @@ the_test_() -> fun(TestVectors) -> [?_assertEqual({T, V, <<>>}, decode(encode(T, V))) || {T, V} <- TestVectors] end}. + + +-define(LISTTESTDATA, [?TESTDATA1, ?TESTDATA2]). +list_test() -> + Encoded = encodelist(?LISTTESTDATA), + ?assertEqual(decodelist(Encoded), ?LISTTESTDATA), + {T1, V1, Rest} = decode(Encoded), + ?assertEqual({T1, V1}, ?TESTDATA1), + {T2, V2, <<>>} = decode(Rest), + ?assertEqual({T2, V2}, ?TESTDATA2). |