編碼EMS較SMS複雜,但每條EMS的基礎仍是SMS,因此我直接繼承了 SMS類。區別主要是要處理好TP_UD和IE。對於ConcatenatedShortMessage,因爲其IE和TP_UDHL佔據了TP_UD的 部分空間,因此每條短信英文只能容納133字符,中文66字符。咱們能夠經過此信息獲得短信條數。數組
若是TP_DCS爲Unicode編碼,則短信條目爲:編碼
TotalMessages= (TP_UD.Length / 4) / 66 + ((TP_UD.Length / 4 Mod 66) = 0)+1spa
若是爲7bit,則爲:code
TotalMessages= (tp_ud.Length / 266) - ((tp_ud.Length Mod 266) = 0)+1繼承
注意在程序中我爲了簡化之後的數組操做,就沒有加一。string
肯定了短信條數之後經過一個循環就能夠提取出每條短信的TP_UD。it
SelectCase tp_dcs基礎
CaseENUM_TP_DCS.UCS2ftp
tmpTP_UD= Mid(TP_UD, i * 66 * 4 + 1, 66 * 4)'When TP_UDL is odd, the max length of anUnicode string in PDU code is 66 Charactor.See [3GPP TS 23.040 V6.5.0 (2004-09]9.2.3.24.1擴展
CaseENUM_TP_DCS.DefaultAlphabet
tmpTP_UD= Mid(tp_ud, i * 133 * 2 + 1, 133 * 2)
EndSelect
此後還須要編碼IE部分,關鍵代碼是肯定TP_UDL的值。對於TP_DCS爲7bit來講肯定此值顯得比較複雜,弄很差容易出現多一個少一個的錯誤。
Iftp_dcs = ENUM_TP_DCS.UCS2 Then
TP_UDL= tmpTP_UD.Length / 2 + 6 + 1 '6: length of IE
End If
Iftp_dcs = ENUM_TP_DCS.DefaultAlphabet Then
TP_UDL= Fix((tmpTP_UD.Length + 7 * 2) * 4 / 7) '6:length of IE
End If
而後根據3GPP裏關於EMS的結構的說明就能夠編寫出EMS PDU的處理程序。詳見原代碼。
若是須要擴展EMS以適應更多種類的EMS,能夠參考3GPP寫出更爲強大的編碼程序。但最關鍵的仍是須要處理好IE以及TP_UDL。
轉自bbs.sendsms.cn