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

📄 手机短信息sms开发—编码和解码.txt

📁 很好的短消息发送实例
💻 TXT
字号:
手机短信息SMS开发—编码和解码 
 
2002-07-04· · ··C++builder资源中心

 
上一页  1 2 3  


  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
{ 

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

} 

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

return WideCharToString(Buf); 

} 

ChangNing(Redpower) 

 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
{ 

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); 

}  
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<=len;i++) 

{ 

if (i
{ 

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; 

}  

 
 
目前手机短信息的应用越来越广泛,互联网上提供短信息发送的站点也越来越多,但一些站点的服务并不尽如人意,往往发出去的短信息石沉大海。最可靠的发送方法当然是用手中的手机了,如果设置了状态报告,更能确切知道对方是否收到了此条信息。手机发送尽管比较可靠, 但也存在输入麻烦、效率低的问题。本文介绍一种方法,只要手机能够与电脑相连(通过红外端口或用手机数据线连接串行口,同时手机支持GSM AT指令集),就可以通过自行编制的短信息发送软件,实现短信息的发送。 
现在市场上的大多数手机均支持类似于Modem控制的GSM AT指令集,该指令集是由诺基亚、爱立信、摩托罗拉和HP等厂家共同为GSM系统研制的,其中包含了对SMS(Short Message Service)的控制。 
GSM AT相关指令的介绍 
与SMS有关的GSM AT指令如表1所示: 
(暂无) 
表1 相关的GSM AT指令 
对SMS的控制共有三种实现途径: 
Block Mode; 
基于AT命令的Text Mode; 
基于AT命令的PDU Mode。 
Text Mode比较简单,多款诺基亚手机均支持该模式。西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因此本文主要探讨PDU模式的发送。 
计算机和手机的通信 
本文以西门子 S3568i为例,介绍如何实现短信息的发送。 
数据线连接 
首先,通过S3525数据线将手机与电脑串行口相连。然后,打开超级终端,选择直接串行口连接,端口参数设为19200速率、无校验、数据位8、停止位1。 
红外线连接 
如果使用带红外端口的计算机,可以设置与手机的无线连接。首先确认计算机红外端口已打开,并将手机的红外线和收传真数据功能打开,对接红外端口,计算机系统托盘上应当出现一个红外设备西门子S35(如果没有安装红外监视器,则不显示)。然后,打开超级终端,选择IrDa上的串行口。 
连接测试 
点击超级终端工具条上的呼叫按钮,输入AT并回车,屏幕上如果出现OK则表明计算机与手机的连接成功,这时就可以输入各类GSM AT指令了。 
如:查询手机厂家,输入AT+CGMI=,屏幕显示Siemens。 
通常情况下,执行测试命令AT+CMGS=?,如果返回OK,表明手机支持此指令。该指令的完整语法格式如下: 
If PDU mode (+CMGF=0)+CMGS=PDU is given 
如果短信息格式指令AT+CMGF返回的是0,则SMS格式为PDU模式,再执行AT+CMGS=<数据长度>命令后,手机返回“>”符号并等待输入,输入PDU数据并以^Z或Esc键结束。 
如果信息发送成功,则返回OK,并显示信息号: 
+CMGS: 
如果发送失败,则返回如下信息: 
+CMS ERROR: 
PDU数据格式的分析 
下面通过对存储在手机中的待发信息的分析,来介绍SMS PDU的数据格式。首先,用手机写一条短信息,发送手机号码为13605696031,信息内容为“Hello World!”。通过执行AT+CMGL=2可以读出此条信息。 
操作过程如下(斜体字符为响应信息,{}内为注释): 
AT 
OK 
AT+CMGL=2 {读未发短信息} 
+CMGL: 1,2,,24 {1表示信息个数,2表示未发信息,24表示信息总容量} 
08 91 683108501505F0 11 00 0B 81 3106656930F1 0000A7 0B E8329BFD06DDDF723619 
OK  
下面分析这条信息: 
08:短信息中心地址长度。 
91:短信息中心号码类型,91是TONNPI。TONNPI遵守InternationalE.164标准,指在号码前需加‘+'号;此外还可有其他数值,但91最常用。 
683108501505F0:短信息号码,是所使用的服务中心地址。由于位置上略有处理,实际号码应为:8613805515500(字母F意指长度减1),这是作者所在地GSM短信息中心的号码。 
11:文件头字节(header byte,是一种bitmask)。这里11指正常地发送短信息。 
00:信息类型。 
0B:被叫号码长度。 
81:被叫号码类型。 
3106656930F1:被叫号码,也经过了移位处理,实际号码为13605696031。 
0000A7:短信息编码类型GSM Default Alphabet,如为中文则是000010。 
0B:短信息长度。 
E8329BFD06DDDF723619:短信息内容“Hello World!”。 
短信息的编码方法及编程实现 
下面我们介绍纯英文和纯中文的信息编码方法。通过测试我们发现,每条发送的短信息前面部分均相同,只是被叫号码和短信息内容有变化。 
1.英文编码 
参见表2,设短信息内容为“Hello World!”。缺省的GSM 字符集为7位编码,可以简单地理解为ASCII码(ASCII值小于80Hex,因此,Bit8被忽略),依次将下一7位编码的后几位逐次移至前面,形成新的8位编码,参见表2箭头指示。需要注意的是第9行,移位计数已达7位,则直接将本编码前加0。GSM并非支持所有的ASCII字符显示。 
表2 英文编码的实现过程 

下面是实现英文编码的部分Delphi 5代码: 
//英文格式编码,s为String 
function Encode1(var s:String):String; 
var 
i,j,len:Integer; 
cur:Integer; 
t:String; 
begin 
Result:=‘'; 
len:=Length(s); 
//j 用于移位计数 
i:=1;j:=0; 
while i<=len do 
begin 
if i//数据变换 
cur:=(ord(s[i]) shr j) or ((ord(s[i+1]) shl (7-j)) and $ff) 
else 
cur:=(ord(s[i]) shr j) and $7f; 
FmtStr(t,‘%2.2X',[cur]); 
Result:=Result+t; 
inc(i); 
//移位计数达到7位的特别处理 
j:=(j+1) mod 7;if j=0 then inc(i); 
end; 
end;   
2.中文编码 
参见表3,设短信息内容为“中文短信息”。中文短信息的实现较简单,只需将GB2312的中文编码转换为代码页为CP936的Unicode编码即可。 
表3 中文编码的实现过程 

通过Delphi的WideString类型转换,可以巧妙地实现GB2312到Unicode的编码转换(注意代码页和操作系统相关联)。下面是实现中文编码的部分Delphi 5代码: 
// 中文格式编码,s为Unicode String 
function Encode2(var s:WideString):String; 
var 
i,len:Integer; 
cur:Integer; 
t:String; 
begin 
Result:=‘'; 
len:=Length(s); 
i:=1; 
while i<=len do 
begin 
cur:=ord(s[i]); 
//BCD转换 
FmtStr(t,‘%4.4X',[cur]); 
Result:=Result+t; 
inc(i); 
end; 
end; 
小 结 
以上介绍了PDU格式的短信息编码。建议英文信息长度不超过140个字符,中文信息不要超过54个汉字。如果使用能够支持文本方式的手机进行发送,实现起来更简单。如发送“Hello World!”,用如下的AT指令即可: 
AT+CGMF=1AT+CGMS=“13650246680”,129 
>Hello World!<^Z>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -