GTM900B短信发送汉字,PDU编码程序详解
扫描二维码
随时随地手机看文章
///////////////////////////////////// ///文 件:PDUdecoding.cs ///程 序 员:klude ///编制日期:2007-11-04 ///概 要:针对国内短信编码(USC2) ///组成结构:包含四个函数: /// smsDecodedCenterNumber(string srvCenterNumber) 短信中心号编码 /// smsPDUEncoded(string srvContent) 短信内容编码 /// smsDecodedNumber(string srvNumber) 接收短信手机号编码 /// smsDecodedsms(string strCenterNumber, string strNumber, string strSMScontent) 整个短信的编码 /// 一个字段 /// string nLength; //要发送内容的长度,由两部分组成,接收手机号加上要发送的内容 /// ///版 本:1.0.20071104 ///用 法: /// 1,把文件拷贝到你的项目中,添加引用 using SMS; /// 2,定义本类,例如:PDUdecoding ss = new SMS.PDUdecoding(); /// 3,现在你就可以使用本类了,例如: /// textBox2.Text = ss.smsDecodedsms(txtCenterNumber.Text,txtNumber.Text,textBox1.Text); //////////////////////////////////// using System; using System.Text; namespace SMS { public class PDUencoding { public readonly static int MAX_CHAR_COUNT = 70;//最长可发送汉字个数 public string nLength; //要发送内容的长度,由两部分组成,接收手机号加上要发送的内容 ///public string smsPDUEncoded(string srvContent) { Encoding encodingUTF = System.Text.Encoding.BigEndianUnicode; string s = null; byte[] encodedBytes = encodingUTF.GetBytes(srvContent); for (int i = 0; i < encodedBytes.Length; i++) { s += BitConverter.ToString(encodedBytes, i, 1); } s = String.Format("{0:X2}{1}", s.Length / 2, s); return s; } ///public string smsEncodedCenterNumber(string srvCenterNumber) { string s = null; if (!(srvCenterNumber.Substring(0, 2) == "86")) { srvCenterNumber = String.Format("86{0}", srvCenterNumber); //检查当前短信中心号是否按标准格式书写,不是,就补上“86” } int nLength = srvCenterNumber.Length; for (int i = 1; i < nLength; i += 2) //奇偶互换 { s += srvCenterNumber[i]; s += srvCenterNumber[i - 1]; } if (!(nLength % 2 == 0)) //是否为偶数,不是就加上F,并对最后一位与加上的F位互换 { s += 'F'; s += srvCenterNumber[nLength - 1]; } s = String.Format("91{0}", s); //加上91,代表短信中心类型为国际化 s = String.Format("{0:X2}{1}", s.Length / 2, s); //编码后短信中心号长度,并格式化成二位十六制 return s; } ///public string smsEncodedNumber(string srvNumber) { string s = null; if (!(srvNumber.Substring(0, 2) == "86")) { srvNumber = String.Format("86{0}", srvNumber); //检查当前接收手机号是否按标准格式书写,不是,就补上“86” } int nLength = srvNumber.Length; for (int i = 1; i < nLength; i += 2) //将奇数位和偶数位交换 { s += srvNumber[i]; s += srvNumber[i - 1]; } if (!(nLength % 2 == 0)) //是否为偶数,不是就加上F,并对最后一位与加上的F位互换 { s += 'F'; s += srvNumber[nLength - 1]; } return s; } ///public string smsEncodedsms(string strCenterNumber, string strNumber, string strSMScontent) { string s = String.Format("{0}11000D91{1}000800{2}", smsEncodedCenterNumber(strCenterNumber), smsEncodedNumber(strNumber), smsPDUEncoded(strSMScontent)); nLength = String.Format("{0:D2}", (s.Length - smsEncodedCenterNumber(strCenterNumber).Length) / 2); //获取短信内容加上手机号码长度 return s; } //public string smsEncodedsms( string strNumber, string strSMScontent) //{ // string s = String.Format("0011000D91{0}000401{1}", smsEncodedNumber(strNumber), smsPDUEncoded(strSMScontent)); // nLength = String.Format("{0:D2}", (s.Length-2)/2); //获取短信内容加上手机号码长度 // return s; //} // 000800中的表示是UCS2编码 public string smsEncodedsms(string strNumber, string strSMScontent) { string s = String.Format("0011000D91{0}000800{1}", smsEncodedNumber(strNumber), smsPDUEncoded(strSMScontent)); nLength = String.Format("{0:D2}", (s.Length - 2) / 2); //获取短信内容加上手机号码长度 return s; } } }
///////////////////////////////////// ///文 件:FFPDUdecoding.cs ///概 要:针对国内短信解码(USC2) ///组成结构:包含四个函数: /// 1、GetEverySMS(string SMS) /// 2、GetTelphone(string SMS) /// 3、GetDataTime(string SMS) /// 4、GetContent(string SMS) //////////////////////////////////// using System; using System.Text; namespace SMS { ///public class PDUdecoding { public PDUdecoding() { // TODO: 在此处添加构造函数逻辑 } ///public bool IsPDU(string SMS) { if (SMS.Substring(40, 2) != "08") return false; return true; } ///public string[] GetEverySMS(string SMS) { char[] str = "n".ToCharArray(); string[] temp = SMS.Split(str); return temp; } ///public string GetTelphone(string SMS) { string tel = SMS.Substring(26, 12); string s = ""; for (int i = 0; i < 9; i += 2) { s += tel[i + 1]; s += tel[i]; } s += tel[tel.Length - 1]; return s; } ///public string GetDataTime(string SMS) { string time = SMS.Substring(42, 12); string s = ""; for (int i = 0; i < 11; i += 2) { s += time[i + 1]; s += time[i]; } string t = s.Substring(0, 2) + "年" + s.Substring(2, 2) + "月" + s.Substring(4, 2) + "日" + s.Substring(6, 2) + ":" + s.Substring(8, 2) + ":" + s.Substring(10, 2); return t; } ///public string GetContent(string SMS) { string c = ""; string len = SMS.Substring(56, 2); int length = System.Convert.ToInt16(len, 16); length *= 2; string content = SMS.Substring(58, length); for (int i = 0; i < length; i += 4) { string temp = content.Substring(i, 4); int by = System.Convert.ToInt16(temp, 16); char ascii = (char)by; c += ascii.ToString(); } return c; } ///public string GetTextContent(string SMS) { string str = ""; string c = ""; byte by; char ascii; int i; SMS = SMS.Replace("r", ""); SMS = SMS.Replace("n", ""); string content = SMS.Substring(58); for (i = content.Length - 2; i >= 0; i -= 2) { by = Convert.ToByte(content.Substring(i, 2), 16); str += Convert.ToString(by, 2).PadLeft(8, '0'); } for (i = str.Length - 7; i >= 0; i -= 7) { by = Convert.ToByte(str.Substring(i, 7), 2); ascii = (char)by; c += ascii.ToString(); } return c; } } }