请教,关于PDU解码
以下是我的PDU解码函数:
''' <summary>
''' 实现对收到的短信进行PDU解码
''' </summary>
''' <remarks></remarks>
Public Class PDUDeCoding
''' <summary>
''' 将短信内容从UniCode转换为中文及正常字符
''' </summary>
''' <param name="str"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function UniCode2c(ByVal str As String) As String
Dim retStr As String = ""
If str.Length Mod 4 = 0 Then '表明数据合法,每四位表示一个字符
Dim I As Integer
For I = 1 To str.Length Step 4
Dim aa As String = Mid(str, I, 4)
retStr += ChrW(Hex2Int(aa))
Next
End If
Return retStr
End Function
''' <summary>
''' 将收到的短信进行PDU解码!解码后返回对象DeCodingCls,该对象存储了发送人号码,短信内容,发送时间。
''' </summary>
''' <param name="PDUstr"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function DeCodingsms(ByVal PDUstr As String) As DeCodingCls
Dim de As New DeCodingCls
'1:取前两位16进制以获得短信中心长度,转换为10进制长度
Dim smsConterlen As Integer = Hex2Int(Strings.Left(PDUstr, 2)) * 2
'2:取得短信中心
de.smsCentent = DeCodingSMSCentent(Mid(PDUstr, 3, smsConterlen))
'3:基本参数,对于00(无回复地址)的信息需要进行测试以调试程序。
Dim pType As String = Mid(PDUstr, 3 + smsConterlen, 2) '基本参数(TP-MTI/MMS/RP) 接收,08(无更多消息,有回复地址),00(无回复地址)
'4:取回复地址个数,即发送人号码,不包括91 和‘F’
Dim addrlen As Integer = Hex2Int(Mid(PDUstr, 5 + smsConterlen, 2))
Dim Addr As String = Mid(PDUstr, 7 + smsConterlen, addrlen + 3)
'5:解码发送人地址,不知道特服号的解码是否与普通手机号解码方法相同,有待测试
de.smsFrom = DeCodingSMSCentent(Addr)
'6:取协议标识(TP-PID) 是普通GSM 类型,点到点方式
Dim bs As String = Mid(PDUstr, 10 + smsConterlen + addrlen, 2)
'7:用户信息编码方式(TP-DCS) UCS2 编码,08表示UCS2编码,否则是其他编码,需要对其进行相应解码以获得短消息内容
Dim EnCodeType As String = Mid(PDUstr, 12 + smsConterlen + addrlen, 2)
'8:服务时间戳(TP-SCTS),获得时间,时间的长度为14位,取回后将每两位分别对调
Dim UCTime As String = Mid(PDUstr, 14 + smsConterlen + addrlen, 14)
de.smsTime = DeCodingTime(UCTime).ToString
'9:取用户信息长度
Dim Textlen As Integer = Hex2Int(Mid(PDUstr, 28 + smsConterlen + addrlen, 2))
'10:读取未解码的信息内容
Dim smsText As String = Mid(PDUstr, 30 + smsConterlen + addrlen, Textlen * 2)
If EnCodeType = "08" Then
'UCS2编码,做PDU解码获得短消息内容
de.smsContent = UniCode2c(smsText)
Else
de.smsContent = "编码方式:" + EnCodeType + "非UCS2编码!程序未配置对非UCS2编码的解码!请联系软件作者!"
End If
Return de
End Function
''' <summary>
''' 对短信中心及发送人的号码进行解码的函数
''' </summary>
''' <param name="PDUTel">要解码的内容</param>
''' <returns></returns>
''' <remarks></remarks>
Public Function DeCodingSMSCentent(ByVal PDUTel As String) As String
If Strings.Left(PDUTel, 2) = "91" Then
PDUTel = Strings.Right(PDUTel, PDUTel.Length - 2)
End If
Dim ReturnTelnumber As String = ""
Dim I As Integer
For I = 1 To PDUTel.Length Step 2
Dim tmp As String = Mid(PDUTel, I, 2)
ReturnTelnumber += Strings.Right(tmp, 1) + Strings.Left(tmp, 1)
Next
ReturnTelnumber = Replace(ReturnTelnumber, "F", "")
If Strings.Left(ReturnTelnumber, 2) = "86" Then
ReturnTelnumber = Strings.Right(ReturnTelnumber, ReturnTelnumber.Length - 2)
End If
Return ReturnTelnumber
End Function
''' <summary>
''' 对服务时间进行解码
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Private Function DeCodingTime(ByVal TimeString As String) As String
If TimeString.Length <> 14 Then
Return Now
End If
Dim returnTime As String = ""
Dim I As Integer
For I = 1 To TimeString.Length Step 2
Dim tmp As String = Mid(TimeString, I, 2)
returnTime += Strings.Right(tmp, 1) + Strings.Left(tmp, 1)
Next
returnTime = "20" + Strings.Left(returnTime, 2) + "-" + Mid(returnTime, 3, 2) + "-" + Mid(returnTime, 5, 2) + " " + Mid(returnTime, 7, 2) + ":" + Mid(returnTime, 9, 2) + ":" + Mid(returnTime, 11, 2)
Return returnTime
End Function
End Class
Public Module SMS
''' <summary>
''' 转换十六进制数为十进制数
''' </summary>
''' <param name="str"></param>
''' <returns></returns>
''' <remarks></remarks>
Public Function Hex2Int(ByVal str As String) As Integer
Dim s As Integer = 0
Dim i As Integer
Dim w As String
For i = 0 To Len(str) - 1
w = Mid(str, Len(str) - i, 1)
If w = "a" Or w = "A" Then w = 10
If w = "b" Or w = "B" Then w = 11
If w = "c" Or w = "C" Then w = 12
If w = "d" Or w = "D" Then w = 13
If w = "e" Or w = "E" Then w = 14
If w = "f" Or w = "F" Then w = 15
w = Val(w)
s = s + w * (16 ^ i)
Next i
Return s
End Function
End Module
''' <summary>
''' 用于存储对某条短信解码后的类对象
''' </summary>
''' <remarks></remarks>
Public Class DeCodingCls
Private _smsContent As String = ""
Private _smsFrom As String = ""
Private _smsTime As String = ""
Private _smsCentent As String = ""
''' <summary>
''' 获得或设置短信中的短信中心号码!
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsCentent() As String
Get
Return _smsCentent
End Get
Set(ByVal value As String)
_smsCentent = value
End Set
End Property
''' <summary>
''' 获得或设置短信的信息内容
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsContent() As String
Get
Return _smsContent
End Get
Set(ByVal value As String)
_smsContent = value
End Set
End Property
''' <summary>
''' 获得或设置短信的发送人号码
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsFrom() As String
Get
Return _smsFrom
End Get
Set(ByVal value As String)
_smsFrom = value
End Set
End Property
''' <summary>
''' 获得或设置短信的发送时间
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Public Property smsTime() As String
Get
Return _smsTime
End Get
Set(ByVal value As String)
_smsTime = value
End Set
End Property
End Class