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