using System;
using System.Text;
namespace CN.SMSLib
{
///
1<summary>
2/// By popcorn 2004.5。
3/// [email protected]
4/// </summary>
public class CNText
{
public CNText()
{
}
///
1<summary>
2/// 编码格式
3/// </summary>
public enum GSMCode
{
Bit7=0,
Bit8=1,
UCS2=2
}
///
1<summary>
2/// 对整个短信息进行解码
3/// </summary>
///
1<param name="s"/>
要解码的信息
///
1<param name="phone"/>
解码后的电话号码
///
1<param name="text"/>
解码后的短信内容
///
1<param name="sendTime"/>
短信时间戳
///
1<param name="code"/>
使用的编码方式
///
1<returns>成功返回true</returns>
static public bool DecodingMsg(string s,ref string phone,ref string text,ref DateTime sendTime,ref GSMCode code,ref string SCA)
{
try
{
//短信息中心
int iLength=int.Parse(s.Substring(0,2),System.Globalization.NumberStyles.AllowHexSpecifier);
if(iLength>0)
{
if(s.Substring(2,2)=="91")
{
SCA+="+";
iLength--;
}
for(int i=0;i
1<ilength*2;i+=2) )="" ;="" <summary="" catch="" code="GSMCode.Bit8;" datetime(int.parse("20"+s.substring(1,1)+s.substring(0,1)),="" else="" false;="" for(int="" i="0;i<iLength;i+=2)" if(code="GSMCode.UCS2)" if(ilength%2="1)iLength++;" if(phone.endswith("f"))phone="phone.Remove(phone.Length-1,1);" if(s.substring(0,2)="00" if(s.substring(2,2)="91" if(sca.endswith("f"))sca="SCA.Remove(SCA.Length-1,1);" ilength="int.Parse(s.Substring(0,2),System.Globalization.NumberStyles.AllowHexSpecifier);" int.parse(s.substring(11,1)+s.substring(10,1)));="" int.parse(s.substring(3,1)+s.substring(2,1)),="" int.parse(s.substring(5,1)+s.substring(4,1)),="" int.parse(s.substring(7,1)+s.substring(6,1)),="" int.parse(s.substring(9,1)+s.substring(8,1)),="" phone="+" phone+="s.Substring(4+i,1);" return="" s="s.Remove(0,16);" sca+="s.Substring(4+i,1);" sendtime="new" text="DecodingBit8(s);" true;="" {="" }="" 发送方号码="" 收到的信息="" 时间戳="" 编码方式="">
2/// 对短信息中心进行编码
3///
4/// <param name="s"/>要编码的号码
5/// <returns>编码后的号码</returns>
6static public string EncodingSCA(string s)
7{
8StringBuilder sb=new StringBuilder();
9if(s.Length==0)
10{
11sb.Append("00");
12return sb.ToString();
13}
14if(s.StartsWith("+"))
15{
16sb.Append("91"); //用国际格式号码(在前面加‘+’)
17s=s.Remove(0,1);
18}
19else
20{
21sb.Append("C8");
22}
23if(s.Length%2==1)s+="F";
24for(int i=0;i<s.length;i+=2) <summary="" len='(sb.Length/2).ToString("X2");' len+sb.tostring();="" return="" sb.append(s.substring(i+1,1));="" sb.append(s.substring(i,1));="" string="" {="" }="">
25/// 对电话号码进行编码
26///
27/// <param name="mobileNo"/>要编码的电话号码
28/// <returns>编码后的电话号码</returns>
29static public string EncodingNumber(string mobileNo)
30{
31StringBuilder sb=new StringBuilder();
32if(mobileNo.StartsWith("+"))
33{
34sb.Append("91");
35mobileNo=mobileNo.Remove(0,1);
36}
37else
38{
39sb.Append("C8");
40}
41string len=mobileNo.Length.ToString("X2");
42if(mobileNo.Length%2==1)mobileNo+="F";
43for(int i=0;i<mobileno.length;i+=2) <summary="" len+sb.tostring();="" return="" sb.append(mobileno.substring(i+1,1));="" sb.append(mobileno.substring(i,1));="" {="" }="">
44/// 使用7-bit进行编码
45///
46/// <param name="s"/>要编码的英文字符串
47/// <returns>信息长度及编码后的字符串</returns>
48static public string EncodingBit7(string s)
49{
50int iLeft=0;
51string sReturn="";
52StringBuilder sb=new StringBuilder();
53for(int i=0;i<s.length;i++) &="" (8-ichar)="" 7;="" <<="" bsrc="(byte)char.Parse(s.Substring(i,1));" byte="" else="" ichar="i" if(ichar="0)" ileft="bSrc" ileft).tostring("x4");="" int="" sreturn="(bSrc" {="" |="" }="" 取源字符串的计数值的最低3位="" 处理源串的每个字节="" 将该字节剩下的左边部分,作为残余数据保存起来="" 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节="" 组内第一个字节,只是保存起来,待处理下一个字节时使用="">> iChar;
54// 修改目标串的指针和计数值 pDst++;
55sb.Append(sReturn.Substring(2,2));
56}
57}
58sb.Append(sReturn.Substring(0,2));
59return (sb.Length/2).ToString("X2")+sb.ToString();
60}
61/// <summary>
62/// 对7-bit编码进行解码
63/// </summary>
64/// <param name="s"/>要解码的字符串
65/// <returns>解码后的英文字符串</returns>
66static public string DecodingBit7(string s)
67{
68int iByte=0;
69int iLeft=0;
70// 将源数据每7个字节分为一组,解压缩成8个字节
71// 循环该处理过程,直至源数据被处理完
72// 如果分组不到7字节,也能正确处理
73System.Text.StringBuilder sb=new System.Text.StringBuilder();
74for(int i=0;i<s.length;i+=2) &="" 0x7f).tostring("x2"));="" <<="" bsrc="byte.Parse(s.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);" byte="" ibyte)="" ileft="bSrc" ileft)="" sb.append((((bsrc="" {="" |="" 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节="" 将该字节剩下的左边部分,作为残余数据保存起来="">> (7-iByte);
75// 修改字节计数值
76iByte++;
77// 到了一组的最后一个字节
78if(iByte == 7)
79{
80// 额外得到一个目标解码字节
81sb.Append(iLeft.ToString("X2"));
82// 组内字节序号和残余数据初始化
83iByte = 0;
84iLeft = 0;
85}
86}
87string sReturn=sb.ToString();
88byte [] buf=new byte[sReturn.Length/2];
89for(int i=0;i<sreturn.length;i+=2) 2]="byte.Parse(sReturn.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);" <summary="" buf[i="" return="" system.text.encoding.ascii.getstring(buf);="" {="" }="">
90/// 使用8-bit进行编码
91///
92/// <param name="s"/>要编码的字符串
93/// <returns>信息长度及编码后的字符串</returns>
94static public string EncodingBit8(string s)
95{
96StringBuilder sb=new StringBuilder();
97byte [] buf=Encoding.ASCII.GetBytes(s);
98sb.Append(buf.Length.ToString("X2"));
99for(int i=0;i<buf.length;i++) <summary="" return="" sb.append(buf[i].tostring("x2"));="" sb.tostring();="" {="" }="">
100/// 使用8-bit进行解码
101///
102/// <param name="s"/>要解码的字符串
103/// <returns>解码后的字符串</returns>
104static public string DecodingBit8(string s)
105{
106byte [] buf=new byte[s.Length/2];
107StringBuilder sb=new StringBuilder();
108for(int i=0;i<s.length;i+=2) 2]="byte.Parse(s.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);" <summary="" buf[i="" encoding.ascii.getstring(buf);="" return="" {="" }="">
109/// 中文短信息UCS2编码
110///
111/// <param name="s"/>要编码的中文字符串
112/// <returns>信息长度及编码后的字符串</returns>
113static public string EncodingUCS2(string s)
114{
115StringBuilder sb=new StringBuilder();
116byte [] buf=Encoding.Unicode.GetBytes(s);
117sb.Append(buf.Length.ToString("X2"));
118for(int i=0;i<buf.length;i+=2) <summary="" return="" sb.append(buf[i+1].tostring("x2"));="" sb.append(buf[i].tostring("x2"));="" sb.tostring();="" {="" }="">
119/// 中文短信息UCS2解码
120///
121/// <param name="s"/>要解码的信息
122/// <returns>解码后的中文字符串</returns>
123static public string DecodingUCS2(string s)
124{
125byte [] buf=new byte[s.Length];
126for(int i=0;i<s.Length;i+=4)
127{
128buf[i/2]=byte.Parse(s.Substring(2+i,2),System.Globalization.NumberStyles.AllowHexSpecifier);
129buf[i/2+1]=byte.Parse(s.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);
130}
131return Encoding.Unicode.GetString(buf);
132}
133
134}
135}</buf.length;i+=2)></s.length;i+=2)></buf.length;i++)></sreturn.length;i+=2)></s.length;i+=2)></s.length;i++)></mobileno.length;i+=2)></s.length;i+=2)></ilength*2;i+=2)>