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