找回密码
 注册
搜索
查看: 1583|回复: 2

[讨论] 手机短信息SMS开发—编码,解码

[复制链接]
发表于 2005-4-18 23:54:00 | 显示全部楼层 |阅读模式
1、  英文编码
缺省的GSM字符集为7位编码,ASCII码为8位编码,编码就是将8位ASCII编码转换为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>n)|((mid2[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>(8-Point));
                if(Point%7==0&&Point!=0)
                        Point=0;
                else
                        Point=Point+1;
                i++;
                j=i-(i/8);

        }
        OutStr[12]=((InStr[12]&0x07)>(8-5));
        return AnsiString(OutStr);
}
3、  中文编码
中文编码较为简单,就是将GB2312的中文编码转换为代码页为CP936的Unicode编码即可
以下是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、  中文解码
将代码页为CP936的Unicode编码转换为GB2312的中文编码即可

以下是C++Builder的实现代码
String  DecodeChinese(String InputStr)
{
        wchar_t Buf[300];
        for(int i=0;i<InputStr.Length();i=i+4)
        {
                Buf[i/4]=StrToInt("0x"+InputStr.SubString(i+1,4));
        }
        Buf[InputStr.Length()/4]=0;
        return WideCharToString(Buf);
}
发表于 2006-7-7 09:40:00 | 显示全部楼层
<P>很好。</P>
点评回复

使用道具 举报

发表于 2006-7-7 17:26:00 | 显示全部楼层
谢谢![em05]
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-23 07:13 , Processed in 0.060165 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表