`
wsql
  • 浏览: 11776190 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

一个手机短信息的编解码类(c#)

阅读更多
using System;
using System.Text;

namespace CN.SMSLib
{
/// <summary>
/// By popcorn 2004.5。
/// cnpopcorn@hotmail.com
/// </summary>
public class CNText
{
public CNText()
{
}
/// <summary>
/// 编码格式
/// </summary>
public enum GSMCode
{
Bit7=0,
Bit8=1,
UCS2=2
}

/// <summary>
/// 对整个短信息进行解码
/// </summary>
/// <param name="s">要解码的信息</param>
/// <param name="phone">解码后的电话号码</param>
/// <param name="text">解码后的短信内容</param>
/// <param name="sendTime">短信时间戳</param>
/// <param name="code">使用的编码方式</param>
/// <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<iLength*2;i+=2)
{
SCA+=s.Substring(5+i,1);
SCA+=s.Substring(4+i,1);
}
if(SCA.EndsWith("F"))SCA=SCA.Remove(SCA.Length-1,1);
}

s=s.Remove(0,iLength*2+6);

//发送方号码
iLength=int.Parse(s.Substring(0,2),System.Globalization.NumberStyles.AllowHexSpecifier);
if(s.Substring(2,2)=="91")
{
phone="+";
}
if(iLength%2==1)iLength++;
for(int i=0;i<iLength;i+=2)
{
phone+=s.Substring(5+i,1);
phone+=s.Substring(4+i,1);
}
if(phone.EndsWith("F"))phone=phone.Remove(phone.Length-1,1);

s=s.Remove(0,iLength+6);
//编码方式
if(s.Substring(0,2)=="08")
code=GSMCode.UCS2;
else if(s.Substring(0,2)=="00")
code=GSMCode.Bit7;
else
code=GSMCode.Bit8;

s=s.Remove(0,2);
//时间戳
sendTime=new DateTime(int.Parse("20"+s.Substring(1,1)+s.Substring(0,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)),
int.Parse(s.Substring(11,1)+s.Substring(10,1)));
s=s.Remove(0,16);

//收到的信息
if(code==GSMCode.Bit7)
{
text=DecodingBit7(s);
}
else if(code==GSMCode.UCS2)
{
text=DecodingUCS2(s);
}
else
{
text=DecodingBit8(s);
}
return true;
}
catch
{
return false;
}
}

/// <summary>
/// 对短信息中心进行编码
/// </summary>
/// <param name="s">要编码的号码</param>
/// <returns>编码后的号码</returns>
static public string EncodingSCA(string s)
{
StringBuilder sb=new StringBuilder();
if(s.Length==0)
{
sb.Append("00");
return sb.ToString();
}
if(s.StartsWith("+"))
{
sb.Append("91");//用国际格式号码(在前面加‘+’)
s=s.Remove(0,1);
}
else
{
sb.Append("C8");
}
if(s.Length%2==1)s+="F";
for(int i=0;i<s.Length;i+=2)
{
sb.Append(s.Substring(i+1,1));
sb.Append(s.Substring(i,1));
}
string len=(sb.Length/2).ToString("X2");
return len+sb.ToString();
}
/// <summary>
/// 对电话号码进行编码
/// </summary>
/// <param name="mobileNo">要编码的电话号码</param>
/// <returns>编码后的电话号码</returns>
static public string EncodingNumber(string mobileNo)
{
StringBuilder sb=new StringBuilder();
if(mobileNo.StartsWith("+"))
{
sb.Append("91");
mobileNo=mobileNo.Remove(0,1);
}
else
{
sb.Append("C8");
}
string len=mobileNo.Length.ToString("X2");
if(mobileNo.Length%2==1)mobileNo+="F";
for(int i=0;i<mobileNo.Length;i+=2)
{
sb.Append(mobileNo.Substring(i+1,1));
sb.Append(mobileNo.Substring(i,1));
}
return len+sb.ToString();
}

/// <summary>
/// 使用7-bit进行编码
/// </summary>
/// <param name="s">要编码的英文字符串</param>
/// <returns>信息长度及编码后的字符串</returns>
static public string EncodingBit7(string s)
{
int iLeft=0;
string sReturn="";
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.Length;i++)
{
// 取源字符串的计数值的最低3位
int iChar = i & 7;
byte bSrc=(byte)char.Parse(s.Substring(i,1));
// 处理源串的每个字节
if(iChar == 0)
{
// 组内第一个字节,只是保存起来,待处理下一个字节时使用
iLeft = (int)char.Parse(s.Substring(i,1));
}
else
{
// 组内其它字节,将其右边部分与残余数据相加,得到一个目标编码字节
sReturn=(bSrc << (8-iChar) | iLeft).ToString("X4");
// 将该字节剩下的左边部分,作为残余数据保存起来
iLeft = bSrc >> iChar;
// 修改目标串的指针和计数值 pDst++;
sb.Append(sReturn.Substring(2,2));
}
}
sb.Append(sReturn.Substring(0,2));
return (sb.Length/2).ToString("X2")+sb.ToString();
}
/// <summary>
/// 对7-bit编码进行解码
/// </summary>
/// <param name="s">要解码的字符串</param>
/// <returns>解码后的英文字符串</returns>
static public string DecodingBit7(string s)
{
int iByte=0;
int iLeft=0;
// 将源数据每7个字节分为一组,解压缩成8个字节
// 循环该处理过程,直至源数据被处理完
// 如果分组不到7字节,也能正确处理
System.Text.StringBuilder sb=new System.Text.StringBuilder();
for(int i=0;i<s.Length;i+=2)
{
byte bSrc=byte.Parse(s.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);
// 将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节
sb.Append((((bSrc << iByte) | iLeft) & 0x7f).ToString("X2"));
// 将该字节剩下的左边部分,作为残余数据保存起来
iLeft = bSrc >> (7-iByte);
// 修改字节计数值
iByte++;
// 到了一组的最后一个字节
if(iByte == 7)
{
// 额外得到一个目标解码字节
sb.Append(iLeft.ToString("X2"));
// 组内字节序号和残余数据初始化
iByte = 0;
iLeft = 0;
}
}
string sReturn=sb.ToString();
byte [] buf=new byte[sReturn.Length/2];
for(int i=0;i<sReturn.Length;i+=2)
{
buf[i/2]=byte.Parse(sReturn.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);
}
return System.Text.Encoding.ASCII.GetString(buf);
}

/// <summary>
/// 使用8-bit进行编码
/// </summary>
/// <param name="s">要编码的字符串</param>
/// <returns>信息长度及编码后的字符串</returns>
static public string EncodingBit8(string s)
{
StringBuilder sb=new StringBuilder();
byte [] buf=Encoding.ASCII.GetBytes(s);
sb.Append(buf.Length.ToString("X2"));
for(int i=0;i<buf.Length;i++)
{
sb.Append(buf[i].ToString("X2"));
}
return sb.ToString();
}
/// <summary>
/// 使用8-bit进行解码
/// </summary>
/// <param name="s">要解码的字符串</param>
/// <returns>解码后的字符串</returns>
static public string DecodingBit8(string s)
{
byte [] buf=new byte[s.Length/2];
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.Length;i+=2)
{
buf[i/2]=byte.Parse(s.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);
}
return Encoding.ASCII.GetString(buf);
}

/// <summary>
/// 中文短信息UCS2编码
/// </summary>
/// <param name="s">要编码的中文字符串</param>
/// <returns>信息长度及编码后的字符串</returns>
static public string EncodingUCS2(string s)
{
StringBuilder sb=new StringBuilder();
byte [] buf=Encoding.Unicode.GetBytes(s);
sb.Append(buf.Length.ToString("X2"));
for(int i=0;i<buf.Length;i+=2)
{
sb.Append(buf[i+1].ToString("X2"));
sb.Append(buf[i].ToString("X2"));
}
return sb.ToString();
}

/// <summary>
/// 中文短信息UCS2解码
/// </summary>
/// <param name="s">要解码的信息</param>
/// <returns>解码后的中文字符串</returns>
static public string DecodingUCS2(string s)
{
byte [] buf=new byte[s.Length];
for(int i=0;i<s.Length;i+=4)
{
buf[i/2]=byte.Parse(s.Substring(2+i,2),System.Globalization.NumberStyles.AllowHexSpecifier);
buf[i/2+1]=byte.Parse(s.Substring(i,2),System.Globalization.NumberStyles.AllowHexSpecifier);
}
return Encoding.Unicode.GetString(buf);
}

}
}

分享到:
评论

相关推荐

    提供一个手机短信息的编解码类c#

    提供一个手机短信息的编解码类c# 提供一个手机短信息的编解码类c# 提供一个手机短信息的编解码类c#

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

    金笛电子邮件、短消息专家 www.mailer.com.cn 手机短信息SMS开发—编码,解码

    c# 2005 PDU短信解码编码

    很好用的PDU短消息解码编码类库,附带例子

    基于c#串口gsm短信开发

    1.基于c#串口gsm短信开发 2.手机短信息的编解码类(c#)

    C#使用GSM Modem的文本短信编码和解码

    西门子的手机大多只支持PDU模式,PDU模式是发送或接收手机SMS信息的一种方法,短信息正文经过十六进制编码后被传送。目前,PDU已取代Block Mode,因我们主要探讨PDU模式的发送。以西门子3508手机为例。

    SMS 消息编码与解码---C语言实现(bit7 bit8 ucs2串口等)

    1,消息编码与解码 1),用C实现7-bit编码和解码的算法 2),用C实现UCS2编码和解码的算法 2,消息的发送(PDU编解码) 1),发送短消息 2),读取短消息 3),删除短消息 3,串口读写短信

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表...,共包含562个C#编程中常用的属性、方法、类和各种技术...

    C#编程经验技巧宝典

    72 &lt;br&gt;0103 如何进行字节数组和字符串的相互转换 72 &lt;br&gt;0104 如何把一个按空格分割的字符串存储在一个ArrayList数组中 73 &lt;br&gt;4.2 获取字符串信息 73 &lt;br&gt;0105 如何获得一个字符串的长度 ...

    北斗返回语句解析代码

    北斗返回信息的解析,将北斗指挥机接收到的BDTXR语句中的信息提取出来,通过utf8编码来实现解码。

    vc++ 应用源码包_6

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_1

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_5

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_2

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    vc++ 应用源码包_3

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    手机解锁秘诀-再也不用上营业厅了

     三星新版手机(从三星600新版开始)所支持的测试指令减少了很多,基本上就只余下以下几个可以成功的: 1 E! Y5 k+ C, `. m  *2767*2878#(EEPROM复位) / W, g' u- K( N% t  *2767*3855#(EEPROM总复位,IMEI有...

    vc++ 开发实例源码包

    电子钟的实现,自绘Button、Static的实现,其中自定了一个辅助主题风格类。 CctryLog(web拦截网页帐号密码) 实现了一个控件去获得IHTMLDocument2接口,然后读取内容,匹配用户名与密码等。 CFile64_src 操作大...

    STM32 125kHZ低频 IC卡读卡器,工程文件、源码、上位机源程序一并奉上-电路方案

    读卡器端的检波电路和滤波放大电路将被调制信号提取处理成单片机能识别的数字信号,输入到STM32F103R8T6的输入捕获功能引脚,再通过STM32F103R8T6将捕获的信号进行曼彻斯特解码,最后将解码信息根据自己设定的通讯...

Global site tag (gtag.js) - Google Analytics