aboutsummaryrefslogtreecommitdiff
path: root/src/ss7_helper.erl
blob: 1c02b8975eabc671aa36002ee83fc21616c6ae8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
-module(ss7_helper).
-author('Daniel Mende <mail@c0decafe.de>').

-include("ss7MAPer.hrl").

-export([encode_phonenumber/4, 
         decode_phonenumber/1,
         encode_msisdn/4,
         decode_imsi/1,
         encode_imsi/1,
         remove_firstN/2,
         tup2bin/1]).

decode_imsi(<<>>) ->
    [];
decode_imsi(Imsi) ->
    <<First:4,Second:4,Rest/bits>> = Imsi,
    Dec = decode_imsi(Rest),
    if
      First==15 -> lists:append([Second], Dec);
      true ->       lists:append([Second,First], Dec)
    end.

encode_imsi([]) ->
    <<>>;
encode_imsi([Last]) ->
    <<15:4, Last:4>>;
encode_imsi([First,Second|Tail]) ->
    EncImsi = encode_imsi(Tail),
    <<Second:4, First:4, EncImsi/binary>>.

%% ===================================================================
%% Phone Number helper
%% ===================================================================

encode_phonenumber(Extension, NatureOfNumber, NumberPlan, Number) ->
    {EncNumber, Digits} = encode_phonenumber(Number),
    <<Digits:8, Extension:1, NatureOfNumber:3, NumberPlan:4, EncNumber/binary>>.
encode_phonenumber([First,Second|Tail]) ->
    {EncNumber, Digits} = encode_phonenumber(Tail),
    {<<Second:4, First:4, EncNumber/binary>>, Digits + 2};
encode_phonenumber([Last]) ->
    {<<15:4, Last:4>>, 1};
encode_phonenumber([]) ->
    {<<>>, 0}.

decode_phonenumber(<<_Extension:1, _NatureOfNumber:1, _NumberPlan:4, Number/binary>>) ->
    decode_imsi(Number).

encode_msisdn(Extension, NatureOfNumber, NumberPlan, Number) ->
    {EncNumber, _} = encode_phonenumber(Number),
    <<Extension:1, NatureOfNumber:3, NumberPlan:4, EncNumber/binary>>.

%% ===================================================================
%% List helper
%% ===================================================================

remove_firstN(_, []) -> [];
remove_firstN(1, [_|T]) -> T;
remove_firstN(N, [_|T]) -> remove_firstN(N-1, T).


tup2bin(Tupel) ->
    binary:list_to_bin([element(I,Tupel) || I <- lists:seq(1,tuple_size(Tupel))]).