?? 16-bit unicode pdu編碼 .txt
字號:
16-bit Unicode PDU編碼
關于短信的編碼方式,網上有很多相關的資料,就我覺得,深圳的蠶蛹先生有一篇叫《C#開發終端式短信的原理和方法》的文章,對這方面的知識和應用介紹得最為詳細,讓我受益匪淺。但是他的編碼方式,主要適用于中國大陸一些地區。下邊我將介紹一種適用于澳門且適合中英文的16-bit Unicode 的PDU編碼方式。
比如我要給我的澳門手機66525472發送內容為“快了,12ab”的一條短消息,它的短信編碼為:0011000B915863565274F2000801105FEB4E86FF0C00310032002000610062。
下邊我來解釋一下編碼的過程。
“001100”中的“00”表示自動加入手機的短信中心號碼,澳門地區的短信中心號為“+8536800855”?!?100”是PDU編碼的固定格式。
“0B”是目標號碼的長度,表示為兩位的十六進制。我們的目標號碼是66525472,加上澳門的區號853,(注意,不計“+”),長度為11,化為二位的十六進制結果就為“0B”。
“915863565274F2”中的“91”表示國際號碼格式“+”,“5863565274F2”是目標號碼奇偶位交換后的結果,注意在交換之前,先確定號碼的長度是否偶數,如果不是,最后要添加F,我們的目標號碼長度為11,是奇數,我們需要加F。原號碼為85366526452F,變換之后就為5863565274F2。
“000801”中的“00”是固定的,表示GSM普通的點對點的方式,“08”表示為16-bit的編碼方式,“01”表示短信暫存在短信服務中心的時間,具體表示多長,我也不記得了,不過時間不算長。
“10”是短信息內容經過編碼后的長度/2的結果,也是兩位的十六進制數。計算該長度之前,我們需要對發送內容進行16-bit Unicode編碼,以下是C#的實現方式。
public string smsPDUEncoded(string Content)
{
Encoding encodingUTF = System.Text.Encoding.BigEndianUnicode;
string s = null;
byte [] encodedBytes = encodingUTF.GetBytes(Content);
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;
}
得到s后我們在計算它的長度就很簡單了,不過在具體的編程過程,你的長度計算公式可能需要改為(s-2)/2,因為內容中添加了字符串的結束符“\0”。
“5FEB4E86FF0C00310032002000610062”是發送內容“快了,12ab”的16-bit編碼。
經過上邊的分析,大家應該對16-bit PDU編碼方式有所了解了吧。有興趣的話,大家可以進入超級終端玩一下,AT指令集網上很多的。這個短信PDU我也是大三暑假弄的,因為要調一個網絡攝像頭的監控程序?,F在也差不多忘了,所以寫得有點亂。下次有時間再系統地整理一下,比如在超級終端測試AT指令以及串口通訊的測試什么的。下次吸取教訓,千萬別太相信自己的記憶力,干了什么事,不管成功與否,一定要好好整理并做好記錄。
《C#開發終端式短信的原理和方法》網址為:
http://www.qqread.com/soft-engineering/p553111102.html
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -