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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

  选择自 redpower 的 Blog

手机短信息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<len)

           {

             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<InputStr.Length();i=i+2)

        {

                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))<<Point)|(InStr[j-1]>>(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<InputStr.Length();i=i+4)

        {

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

        }

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

        return WideCharToString(Buf);

}

手机短信息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<len)

           {

             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<InputStr.Length();i=i+2)

        {

                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))<<Point)|(InStr[j-1]>>(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<InputStr.Length();i=i+4)

        {

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

        }

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

        return WideCharToString(Buf);

}

SMS短信平台项目业务管理系统源码开发实例 sms短信项目平台管理系统是采用开源的cms网站内容管理系统核心框架开发,主要用于接码与短信发送。 短信管理系统分五大子系统:短信管理平台、系统接口层、短信下发策略、短信网关接口、监控系统,分别完成不同的功能,也可组合成复杂的综合系统。 接入子系统的功能是通过协议接入第三方客户和推送状态报告,采用异步通信机制,状态报告数据直接推送给对方;短信管理平台提供权限管理,客户管理,黑名单和敏感词管理以及下发日志统计查询等功能。短信下发策系统主要是对接收到的短信进行黑名单、敏感词、流量、路由等方面的控制和过滤 阅读详情

相关推荐

短信7位编码的C实现

7位编码的C语言实现,这个代码绝对可用。

短信编码介绍

收发短消息又分为三种模式:Block模式、Text模式和PDU模式。使用Block机生产厂家提供驱动支持,这种方法现在很少用了。Text Mode是纯文本方式,可使用不同的字符集,从技术上说也可用于发送中文短消息,但国内手机基本上不支持,主要用于欧美地区,也不在本文讨论范围之列。PDU串表面上是一串ASCII码,由‘0’-‘9’、 ‘A’-‘F’这些数字和字母组成。它们是8位字节的十六进制数,或者

nic_r的专栏 7057

短信SMS开发包 实现短信猫开发

都信短信猫开发包 短信SMS开发包 实现短信猫开发

短信SMS的字符集

做GSM的短信实验时,发现有一点奇怪的事 就是如果在手机里写一个大括号"{"(0x7B),在接收端调试的时候 收到的是字符并不是一个0x7B<{> 而是两个0x1B0x28,也就是<ESC><(> 当时很纳闷 查了一下,才发现原来GSM的字符集和ASCII码是有不同的 变化可以参考 http://www.csoft.co.uk/sms/cha...

weixin_30587025的博客 278

SMS短信开发技术

  SMS短信开发技术总结--协议篇   现在提供短信服务的SP都需要接入到各个移动运营商,虽然作为短信来说是同过SMPP协议和移动的交换中心进行通信。但是为了提供信息服务,对各种业务进行业务管理,以及计费,因此每个移动运营商都开发了相应的网关协议,给SP做开发接口。因此这些网关协议就是做一次转换,把SP发过来的信息转换成SMPP协议发送给交换中心,并且实现了计费以及业务的管理功能。 

JonnyWei的专栏 2978

[SMS开发总结]短信开发技术总结--开发

 在上一篇协议篇里面,相信大家都对现有的移动运营商提供的短信网关协议有一定的了解。OK,那么我继续总结下去,开始和大家探讨一下如何基于这些网关协议 开发短信系统,我在这里只是总结开发的思路,并不提供代码,因为具体到代码的实现就是各自的开发功力问题,不在技术总结的范围。不过,欢迎大家到SP论坛 或者天堂鸟论坛来一起交流代码的实现。    现在当SP向移动运营商申请接入后,移动运营商除了提供他们所采用

lee576的专栏 2044

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

手机短信息SMS开发编码,解码 作者:ChangNing(Redpower) 更新时间: 2005-05-15    

~~Jason 程序人生~~ 1499

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

http://www.yesky.com/20020701/1618435_1.shtml

mylhw的专栏 1199

嵌入式GSM短信息接口的软硬件设计

摘要:SMS短信息服务作为GSM网络的一种基本业务已得到越来越多的系统运营商和系统开发商的重视,以GSM网络作为数据无线传输网络,可以开发出多种前景极其乐观的各类应用。本文给出一个小型的嵌入式SMS中/英文短信息接口的设计,并详细讨论PDU模式的短信息格式和中文短信息软件解码的设计。    关键词:GSM SMS UTF-8 GB-2312 无线通信 无线数传 遥控 中文编码引 言  

ncdawen的专栏 2268
上一篇: PDU格式
下一篇: 花卉养植的注意事项
bishopinred
博客等级 码龄23年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值