短信中VB.NET編碼PDU(二)

EMS——ConcatenatedShortMessage部分數組

編碼EMSSMS複雜,但每條EMS的基礎仍是SMS,因此我直接繼承了SMS類。區別主要是要處理好TP_UDIE。對於ConcatenatedShortMessage,因爲其IETP_UDHL佔據了TP_UD的部分空間,因此每條短信英文只能容納133字符,中文66字符。咱們能夠經過此信息獲得短信條數。編碼

若是TP_DCSUnicode編碼,則短信條目爲: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_DCS7bit來講肯定此值顯得比較複雜,弄很差容易出現多一個少一個的錯誤。

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

相關文章
相關標籤/搜索