diff options
Diffstat (limited to 'src/sms_7bit_encoding.erl')
-rw-r--r-- | src/sms_7bit_encoding.erl | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/sms_7bit_encoding.erl b/src/sms_7bit_encoding.erl new file mode 100644 index 0000000..4c39b78 --- /dev/null +++ b/src/sms_7bit_encoding.erl @@ -0,0 +1,67 @@ +-module(sms_7bit_encoding). + +-author("dawid.figiel@gmail.com"). +-compile(export_all). + +%% 7-bit encoding +%% --------------------------------------------------------------------- +%% Function for converting string to 7-bit encoding according to: +%% GSM 03.38 Version 5.3.0 +%% --------------------------------------------------------------------- +%% Initial Function call: to_7bit(String). +%% --------------------------------------------------------------------- +%% Input: String containing only ASCII characters +%% --------------------------------------------------------------------- +%% Output: Binary encoded String +%% --------------------------------------------------------------------- +to_7bit([]) -> <<>>; +to_7bit(String) -> to_7bit(list_to_binary(String),<<>>,1). + +to_7bit(<<Char1:8>>,<<>>,_Cntr) -> <<<<Char1>>/binary>>; +to_7bit(<<_Char1:8>>,Out,8) -> Out; +to_7bit(<< Char1:8>>,Out,7) -> +%% << Out/binary,<<((Char1 bsr 6) bor 26)>>/binary >>; + << Out/binary,<<((Char1 bsr 6) bor 64)>>/binary >>; +to_7bit(<<Char1:8>>,Out,Cntr) -> + << Out/binary,<<(Char1 bsr (Cntr - 1))>>/binary >>; +to_7bit(<<_Char:8,In/binary>>,Out,8)-> + to_7bit(In,Out,1); +to_7bit(<<Char1:8,Char2:8,In/binary>>,Out,Cntr)-> + SRChar1 = Char1 bsr (Cntr - 1), + NewChar1 = <<Char2:Cntr,SRChar1:(8-Cntr)>>, + to_7bit(<<<<Char2>>/binary,In/binary>>,<<Out/binary,NewChar1/binary>>,Cntr+1). + +%% 7-bit decoding +%% --------------------------------------------------------------------- +%% Function for converting 7-bit encoding to String according to: +%% GSM 03.38 Version 5.3.0 +%% --------------------------------------------------------------------- +%% Initial Function call: from_7bit(SevenBitEncodedBinary). +%% --------------------------------------------------------------------- +%% Input: Binary encoded String +%% --------------------------------------------------------------------- +%% Output: String containing only ASCII characters +%% --------------------------------------------------------------------- +from_7bit(List) when is_list(List) -> from_7bit(list_to_binary(List)); +from_7bit(<<>>) -> []; +from_7bit(Bin) -> + from_7bit(Bin,<<>>,<<>>,1). + +%%from_7bit(<<>>,<<13>>,Out,8) -> +from_7bit(<<>>,<<32>>,Out,8) -> + binary_to_list(Out); +from_7bit(<<>>,<<CharN>>,Out,8) -> + binary_to_list(<<Out/binary,CharN:8>>); +from_7bit(<<>>,<<0>>,Out,_Cntr) -> + binary_to_list(Out); +from_7bit(<<>>,<<CharN>>,Out,Cntr) -> + binary_to_list(<<Out/binary,0:(9-Cntr),CharN:(Cntr-1)>>); +from_7bit(<<CharN:1,CharO:7,In/binary>>,<<CharI>>,Out,8) -> + from_7bit(In,<<CharN>>,<<Out/binary,0:1,CharI:7,0:1,CharO:7>>,2); +from_7bit(<<Byte:8,In/binary>>,<<>>,<<>>,1) -> + CharN = Byte bsr 7, + from_7bit(In,<<CharN>>,<<(Byte band 127)>>,2); +from_7bit(<<Byte:8,In/binary>>,<<CharI>>,Out,Cntr) -> + Char = (Byte bsl (Cntr - 1)) bor CharI, + CharN = Byte bsr (8 - Cntr), + from_7bit(In,<<CharN>>,<<Out/binary,0:1,Char:7>>,Cntr+1). |