📄 smscodec.pas
字号:
// not part of SMS message.
if PanjangUDH > 0 then
StrASCII := Copy(StrASCII,PanjangUDH + 3,Length(StrASCII));
Result := StrASCII;
end; { TSMSCODEC.PDU7BIT2ASCII }
{
--------------------------------------------------------------------------------
function PDU8BIT2ASCII
-> Convert string 8-bit PDU to ASCII
-> parameter:
strPDU: string; -> the 8 bit PDU string
PanjangUDH: integer; -> length of the UDH
PanjangData: integer; -> Length of the data
-> return value: string (ASCII)
--------------------------------------------------------------------------------
}
function TSMSCODEC.PDU8BIT2ASCII(StrPDU : string; PanjangUDH, PanjangData: integer) : string;
var StrASCII : string;
i, x, PjPDUPesan : integer;
begin
if PanjangUDH <> 0 then
begin
x := (PanjangUDH * 2) + 2; // PDU info UDH
StrPDU := RightStr(StrPDU,(PanjangData * 2) - x); // PDU Pesan
end;
PjPDUPesan := Length(StrPDU);
i := 1;
while i <= PjPDUPesan do
begin
if i mod 2 = 0 then
begin
StrASCII := StrASCII + Chr(EQ7BIT2ASCII[StrToInt('$' + LeftStr(StrPDU,2))]);
StrPDU := RightStr(StrPDU,Length(StrPDU)-2);
end;
Inc(i);
end;
result := StrASCII;
end; { TSMSCODEC.PDU8BIT2ASCII }
{
--------------------------------------------------------------------------------
function PDU16BIT2ASCII
-> COnvert StrPDU (string 16-bit PDU) to ASCII
-> parameter:
strPDU: string; -> the 8 bit PDU string
PanjangUDH: integer; -> length of the UDH
PanjangData: integer; -> Length of the data
-> Return value: string (ASCII)
--------------------------------------------------------------------------------
}
function TSMSCODEC.PDU16BIT2ASCII(StrPDU : string; PanjangUDH, PanjangData: integer) : string;
var StrASCII : string;
i, x, PjPDUPesan : integer;
begin
if PanjangUDH <> 0 then
begin
x := (PanjangUDH * 2) + 2;
StrPDU := RightStr(StrPDU,(PanjangData * 2) - x);
end;
PjPDUPesan := Length(StrPDU);
i := 1;
while i <= PjPDUPesan do
begin
if i mod 4 = 0 then
begin
StrASCII := StrASCII + Chr(EQ7BIT2ASCII[StrToInt('$' + LeftStr(StrPDU,4))]);
StrPDU := RightStr(StrPDU,Length(StrPDU)-4);
end;
Inc(i);
end;
result := StrASCII;
end; { TSMSCODEC.PDU16BIT2ASCII }
{
--------------------------------------------------------------------------------
function ASCII2PDU7BIT
-> Convert par StrASCII (string ASCII) to 7-bit PDU
-> parameter:
strASCII: string; -> the ASCII string
-> Return value: string (7-bit PDU)
--------------------------------------------------------------------------------
}
function TSMSCODEC.ASCII2PDU7BIT(StrASCII : string) : string;
var i,x,z : integer;
ArrPDU : array of string;
Arr7Bit : array of string;
StrPDU : string;
begin
for i := 1 to Length(StrASCII) do
begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
case Ord(StrASCII[i]) of
12 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(10),7);
end;
94 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(20),7);
end;
123 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(40),7);
end;
125 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(41),7);
end;
92 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(47),7);
end;
91 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(60),7);
end;
126 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(61),7);
end;
93 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(62),7);
end;
124 : begin
SetLength(Arr7BIT,Length(Arr7BIT)+1);
Arr7BIT[High(Arr7BIT)-1] := RightStr(Binerkan(27),7);
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(64),7);
end;
else
begin
Arr7BIT[High(Arr7BIT)] := RightStr(Binerkan(EQASCII27BIT[Ord(StrASCII[i])]),7);
end;
end; { case }
end; { for }
i := 1;
x := 1;
z := 0;
SetLength(ArrPDU,z+1);
while i <= High(Arr7BIT) do
begin
if (i > 1) and ((i) mod 8 = 0) then
begin
x := 1;
inc(i);
end
else
begin
ArrPDU[z] := RightStr(Arr7BIT[i],x) + Arr7BIT[i-1];
SetLength(Arr7BIT[i],Length(Arr7BIT[i])-x);
inc(z);
SetLength(ArrPDU,z+1);
Inc(x);
Inc(i);
end;
end;
ArrPDU[High(ArrPDU)] := Arr7BIT[High(Arr7BIT)];
for i := 0 to High(ArrPDU) do
StrPDU := StrPDU + IntToHex(Bin2Long(ArrPDU[i]),2);
ArrPDU := nil;
Arr7Bit := nil;
{if RightStr(StrPDU,2) = '00' then
StrPDU := LeftStr(StrPDU,Length(StrPDU)-2);}
Result := StrPDU;
end; { TSMSCODEC.ASCII2PDU7BIT }
{
--------------------------------------------------------------------------------
procedure DecodeSMS
-> Decode the SMSPDU then parse the element (such as the sender and the message) to be returned.
-> Return value: stringlist (length: 2, index 0: sender number, index 1: the message
--------------------------------------------------------------------------------
}
function TSMSCODEC.DecodeSMS(StrSMS : string) : TStringList;
var i, j, x, y, z, PanjangUDH, PanjangData : integer;
StrBiner, StrPDU, StrPengirim, s : string;
PakeUDH, Alpha : boolean; Elemen : TStringList;
zDCS : integer; zDCSBinIdx23 : string;
begin
Elemen := TStringList.Create;
i := 1;
PakeUDH := False;
Alpha := False;
x := StrToInt('$' + Copy(StrSMS,i,2));
i := i + 2;
i := i + (x * 2);
x := StrToInt('$' + Copy(StrSMS,i,2));
StrBiner := Binerkan(x);
if StrBiner[2] = '1' then
begin
PakeUDH := True;
end;
i := i + 2;
x := StrToInt('$' + Copy(StrSMS,i,2));
y := x;
i := i + 2;
z := StrToInt('$' + Copy(StrSMS,i,2));
StrBiner := Binerkan(z);
if Copy(StrBiner,2,3) = '101' then
Alpha := True;
i := i + 2;
if x mod 2 <> 0 then
x := x + 1;
s := Copy(StrSMS,i,x);
for j := 1 to Length(s) do
begin
if j mod 2 = 0 then
begin
StrPengirim := StrPengirim + s[j] + s[j-1];
end;
end;
if Alpha = True then
begin
StrPengirim := PDU7BIT2ASCII(s,0,Length(s));
StrPengirim := StringReplace(StrPengirim,'@','',[rfReplaceAll]);
end
else
StrPengirim := Copy(StrPengirim,1,y);
Elemen.Add(StrPengirim);
i := i + x + 2;
// Data Coding Schemes (DCS)
z := StrToInt('$' + Copy(StrSMS,i,2));
StrBiner := Binerkan(z);
zDCSBinIdx23 := Copy(StrBiner,5,2);
zDCS := 0;
if zDCSBinIdx23 = '00' then
zDCS := 0; // 7-bit
if zDCSBinIdx23 = '01' then
zDCS := 1; // 8-bit
if zDCSBinIdx23 = '10' then
zDCS := 2; // UCS2
if zDCSBinIdx23 = '11' then
zDCS := 0; // reserved (pake 7-bit)
i := i + 2;
x := 14; // abaikan SCTS
i := i + x;
PanjangData := StrToInt('$' + Copy(StrSMS,i,2));
i := i + 2;
StrPDU := Copy(StrSMS,i,Length(StrSMS));
if PakeUDH then
PanjangUDH := StrToInt('$' + Copy(StrSMS,i,2))
else
PanjangUDH := 0;
case zDCS of
0 : Elemen.Add(PDU7BIT2ASCII(StrPDU, PanjangUDH, PanjangData));
1 : Elemen.Add(PDU8BIT2ASCII(StrPDU, PanjangUDH, PanjangData));
2 : Elemen.Add(PDU16BIT2ASCII(StrPDU, PanjangUDH, PanjangData));
else
Elemen.Add(PDU7BIT2ASCII(StrPDU, PanjangUDH, PanjangData));
end;
Result := Elemen;
end; { TSMSCODEC.DecodeSMS }
{
--------------------------------------------------------------------------------
procedure EncodeSMS
-> Compose an SMS message
-> Paramaters:
strTujuan = string; -> The destination number
strPesan = string; -> Your message to be sent
-> Return value: SMS-PDU
--------------------------------------------------------------------------------
}
function TSMSCODEC.EncodeSMS(StrTujuan, StrPesan: string): string;
var zTujuan, zPesan, Gabung: string;
i, pjTujuan : integer;
begin
pjTujuan := Length(StrTujuan);
// If length of StrTujuan is odd, add "F" to the end
if Length(StrTujuan) mod 2 = 1 then
StrTujuan := StrTujuan + 'F';
// The reversing process of destination number (swapped nibble)
for i := 1 to Length(StrTujuan) do
begin
if i mod 2 = 0 then
begin
zTujuan := zTujuan + StrTujuan[i] + StrTujuan[i-1];
end;
end;
// We use internasional format here, add 91 in front of the destination number
zTujuan := IntToHex(pjTujuan,2) + '91' + zTujuan;
if Length(StrPesan) > 0 then
zPesan := ASCII2PDU7BIT(StrPesan); // We use 7Bit encoding here
// Add the hexadecimal reperesentation of the PDU length (1/2 of the number of chars) in front of the PDU
zPesan := IntToHex(Length(StrPesan),2) + zPesan;
// We use the SMSC number in the cellphone/gsmmodem, no status report, no UDH
Gabung := '000100' + zTujuan + '0000' + zPesan;
result := Gabung;
end; { TSMSCODEC.EncodeSMS }
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -