⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smscodec.pas

📁 This source code in Delphi 7.0. Have function to decoding and encoding PDU format to ASCII and from
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    // 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 + -