手机短信息SMS开发—编码,解码

    技术2022-05-11  169

    手机短信息SMS开发编码,解码

    1、  英文编码

    缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8ASCII编码转换为7位编码。

    例如:1234 编码后得到31D98C06

    2进制表示

    8位编码 00110001 00110010 00110011 00110100

    7位编码 00110001 11011001 10001100 00000110

    通过例子可以看出,将ascii8位编码的Bit8去掉,依次将下7位编码的后几位逐次移到前面,形成新的8位编码。

    以下是C++Builder的实现代码:

    String __stdcall EncodeEnglish(String InputStr)

    {

            int n,len,cur;

            String tempstr,returnstr;

            unsigned char mid1[2],mid2[2];

            len=InputStr.Length();

            n=0;

            for(int i=1;i<=len;i++)

            {

               if (i < FONT>

               {

                 strcpy(mid1,InputStr.SubString(i,1).c_str());

                 strcpy(mid2,InputStr.SubString(i+1,1).c_str());

                 cur=(mid1[0]>>n)|((mid2[0]<<(7-n))& 0xff);

               }

               else

               {

                 strcpy(mid1,InputStr.SubString(i,1).c_str());

                 cur=(mid1[0]>>n)& 0x7f;

               }

               FmtStr(tempstr,"%2.2X",ARRAYOFCONST((cur)));

               returnstr=returnstr+tempstr;

               n=(n+1)%7;

               if (n==0)

                       i++;

                 }

    return returnstr;

    }

    2、  英文解码

    简单地说就是将7位字符编码转换为8为字符编码

    以下是C++Builder的实现代码:

    int ReturnHex(int Value)

    {

            switch (Value)

            {

              case 0:

                    Value=0x7f;

                    break;

              case 1:

                    Value=0x3f;

                    break;

              case 2:

                    Value=0x1f;

                    break;

              case 3:

                    Value=0x0f;

                    break;

              case 4:

                    Value=0x07;

                    break;

              case 5:

                    Value=0x03;

                    break;

              case 6:

                    Value=0x01;

                    break;

              case 7:

                    Value=0x00;

                    break;

            }

            return Value;

    }

    String __stdcall DecodeEnglish (String InputStr)

    {

            unsigned char InStr[300];

            char OutStr[300];

            String str;

            int j=0,i=0;

            int Point=0;

            int temp;

            memset(InStr,0,301);

            memset(OutStr,0,301);

            for(int i=0;i < FONT>

            {

                    str="0x"+InputStr.SubString(i+1,2);

                    InStr[i/2]=StrToInt(str);

            }

            while(j<=InputStr.Length()/2)

            {

                    if(Point==0)

                            OutStr[i]=InStr[j]&ReturnHex(Point);

                    else

    OutStr[i]=((InStr[j]&ReturnHex(Point))< >(8-Point));

                    if(Point%7==0&&Point!=0)

                            Point=0;

                    else

                            Point=Point+1;

                    i++;

                    j=i-(i/8);

     

            }

            OutStr[12]=((InStr[12]&0x07)<<5)|(InStr[11]>>(8-5));

            return AnsiString(OutStr);

    }

    3、  中文编码

    中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936Unicode编码即可

    以下是C++Builder的实现代码

    String  EncodeChinese(String InputStr)

    {

                 int cur;

    String tempstr,returnstr;

    WideString ws;

    wchar_t  mid[2];

    ws=WideString(InputStr);

    for(int i=1;i<=ws.Length();i++)

    {

    wcscpy(mid,ws.SubString(i,1).c_bstr());

    cur=mid[0];

    FmtStr(tempstr,"%4.4X",ARRAYOFCONST((cur)));

    returnstr=returnstr+tempstr;

    }

    return returnstr;

    }

    4、  中文解码

    将代码页为CP936Unicode编码转换为GB2312的中文编码即可

     

    以下是C++Builder的实现代码

    String  DecodeChinese(String InputStr)

    {

            wchar_t Buf[300];

            for(int i=0;i < FONT>

            {

                    Buf[i/4]=StrToInt("0x"+InputStr.SubString(i+1,4));

            }

            Buf[InputStr.Length()/4]=0;

            return WideCharToString(Buf);

    }

    薛长宇

    changning@ynmail.com

    redpower2004@21cn.com

    2001-8-7


    最新回复(0)