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; //要發送內容的長度,由兩部分組成,接收手機號加上要發送的內容 /// <summary> /// 函數功能:短信內容編碼 /// 函數名稱:smsPDUEncoded(string srvContent) /// 參 數:srvContent 要進行轉換的短信內容,string類型 /// 返 回 值:編碼後的短信內容,string類型 /// 程 序 員:klude /// 編制日期:2007-11-04 /// 函數說明: /// 1,採用Big-Endian 字節順序的 Unicode 格式編碼,也就說把高低位的互換在這裏完成了 /// 2,將轉換後的短信內容存進字節數組 /// 3,去掉在進行Unicode格式編碼中,兩個字節中的"-",例如:00-21,變成0021 /// 4,將整條短信內容的長度除2,保留兩位16進制數 /// </summary> 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; } /// <summary> /// 函數功能:短信中心號編碼 /// 函數名稱:smsDecodedCenterNumber(string srvCenterNumber) /// 參 數:srvCenterNumber 要進行轉換的短信中心號,string類型 /// 返 回 值:編碼後的短信中心號,string類型 /// 程 序 員:klude /// 編制日期:2007-11-04 /// 函數說明: /// 1,將奇數位和偶數位交換。 /// 2,短信中心號奇偶數交換後,看看長度是否爲偶數,如果不是,最後添加F /// 3,加上短信中心號類型,91爲國際化 /// 4,計算編碼後的短信中心號長度,並格化成二位的十六進制 /// </summary> 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; } /// <summary> /// 函數功能:接收短信手機號編碼 /// 函數名稱:smsDecodedNumber(string srvNumber) /// 參 數:srvCenterNumber 要進行轉換的短信中心號,string類型 /// 返 回 值:編碼後的接收短信手機號,string類型 /// 程 序 員:klude /// 編制日期:2007-11-04 /// 函數說明: /// 1,檢查當前接收手機號是否按標準格式書寫,不是,就補上“86” /// 1,將奇數位和偶數位交換。 /// 2,短信中心號奇偶數交換後,看看長度是否爲偶數,如果不是,最後添加F /// </summary> 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; } /// <summary> /// 函數功能:整個短信的編碼 /// 函數名稱:smsDecodedsms(string strCenterNumber, string strNumber, string strSMScontent) /// 參 數:strCenterNumber 要進行轉換的短信中心號,string類型 /// strNumber 接收手機號碼,string類型 /// strSMScontent 短信內容 /// 返 回 值:完整的短信編碼,可以在AT指令中執行,string類型 /// 程 序 員:klude /// 編制日期:2007-11-04 /// 函數說明: /// 11000D91和000800 在國內,根據PDU編碼原則,我們寫死在此,詳細解釋請看我的文章 /// 31000D91//短信報告 /// </summary> 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 { /// <summary> /// FPDUdecoding 的摘要說明。 /// </summary> public class PDUdecoding { public PDUdecoding() { // TODO: 在此處添加構造函數邏輯 } /// <summary> /// 判斷接受的短信是PDU格式還是TEXT格式 /// </summary> public bool IsPDU(string SMS) { if (SMS.Substring(40, 2) != "08") return false; return true; } /// <summary> /// 函數功能:短信內容提取 /// 函數名稱:GetEverySMS(string SMS) /// 參 數:SMS 要進行提取的整個短信內容 /// 返 回 值:將多個短信內容拆分 /// </summary> public string[] GetEverySMS(string SMS) { char[] str = "\n".ToCharArray(); string[] temp = SMS.Split(str); return temp; } /// <summary> /// 函數功能:提取短信的發送人電話號碼 /// 函數名稱:GetTelphone(string SMS) /// 參 數:SMS 要進行轉換的整個短信內容 /// 返 回 值:電話號碼 /// </summary> 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; } /// <summary> /// 函數功能:提取短信的發送時間 /// 函數名稱:GetDataTime(string SMS) /// 參 數:SMS:要進行轉換的整個短信內容 /// 返 回 值:發送時間 /// </summary> 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; } /// <summary> /// 函數功能:提取短信的內容(PDU) /// 函數名稱:GetContent(string SMS) /// 參 數:SMS:要進行轉換的整個短信內容 /// 返 回 值:短信內容 /// </summary> 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; } /// <summary> /// 函數功能:提取短信的TEXT內容(TEXT) /// 函數名稱:GetTextContent(string SMS) /// 參 數:SMS:要進行轉換的整個短信內容 /// 返 回 值:短信內容 /// </summary> 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; } } }
交流羣:313906225
發佈了28 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章