⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sms.vb

📁 手机短信PDU编码解码函数
💻 VB
字号:
Public MustInherit Class SMS
    '原始信息
    Public SCAddressLength As Byte
    Public SCAddressType As Byte
    Public SCAddressValue As String
    Public FirstOctet As Byte
    Public TP_PID As Byte
    Public TP_DCS As Byte
    Public TP_UDL As Byte
    Public TP_UD As String
    Public Text As String
    Public Type As SMSType
    '详细信息
    Public UserData As String

    Public Enum SMSType
        SMS_RECEIVED = 0
        SMS_STATUS_REPORT = 2
        SMS_SUBMIT = 1
        EMS_RECEIVED = 64 '我的手机机上是Reserverd奇怪
        EMS_SUBMIT = 65
    End Enum

    Public MustOverride Sub GetOrignalData(ByVal PDUCode As String)

    Shared Function GetByte(ByRef PDUCode As String) As Byte
        Dim r As Byte = Val("&H" + Mid(PDUCode, 1, 2))
        PDUCode = Mid(PDUCode, 3)
        Return r
    End Function

    Shared Function GetString(ByRef PDUCode As String, ByVal Length As Integer) As String
        Dim r As String = Mid(PDUCode, 1, Length)
        PDUCode = Mid(PDUCode, Length + 1)
        Return r
    End Function

    Shared Function GetDate(ByRef SCTS As String) As Date
        Dim year, month, day, hour, minute, second, timezone As Integer

        year = Val(Swap(GetString(SCTS, 2))) + 2000
        month = Val(Swap(GetString(SCTS, 2)))
        day = Val(Swap(GetString(SCTS, 2)))
        hour = Val(Swap(GetString(SCTS, 2)))
        minute = Val(Swap(GetString(SCTS, 2)))
        second = Val(Swap(GetString(SCTS, 2)))
        timezone = Val(Swap(GetString(SCTS, 2)))

        Dim result As New Date(year, month, day, hour, minute, second)
        Return result
    End Function

    Shared Function Swap(ByRef TwoBitStr As String) As String
        Dim c() As Char = TwoBitStr.ToCharArray
        Dim t As Char
        t = c(0)
        c(0) = c(1)
        c(1) = t
        Return (c(0) + c(1)).ToString
    End Function

    Shared Function GetAddress(ByRef Address As String) As String
        Dim tmpChar As Char() = Address.ToCharArray
        Dim i As Integer, result As String
        For i = 0 To tmpChar.GetUpperBound(0) Step 2
            result += Swap(tmpChar(i) + tmpChar(i + 1))
        Next
        If InStr(result, "F") Then result = Mid(result, 1, result.Length - 1)
        Return result
    End Function

    Shared Function GetSMSType(ByVal PDUCode As String) As SMS.SMSType
        '取得FirstOctet
        Dim FirstOctet As Byte
        Dim L As Integer = SMS.GetByte(PDUCode)
        SMS.GetByte(PDUCode)
        SMS.GetString(PDUCode, (L - 1) * 2)
        FirstOctet = SMS.GetByte(PDUCode)
        '取得特征码
        '取得基本码 最后两个bit + 是否有header作为标记
        Dim t1 As Integer = FirstOctet And 3 '00000011
        Dim t2 As Integer = FirstOctet And 64 '01000000
        '特别处理
        If t1 = 3 And t2 = 64 Then Return SMS.SMSType.EMS_SUBMIT
        Return t1 + t2
    End Function


    Shared Function UnicodeToGB(ByVal strUnicode As String) As String
        Dim GBCode As String
        Dim i, j As Integer
        Dim c() As String       '临时变量
        ReDim c(strUnicode.Length / 4)     '2个字节一个中文

        For j = 0 To strUnicode.Length \ 4 - 1
            Dim d() As Char = strUnicode.ToCharArray(j * 4, 4)
            c(j) = "&H" & CType(d, String)
            c(j) = ChrW(Val(c(j)))
            GBCode += c(j)    '将最后的结果返回
        Next
        Return GBCode
    End Function

End Class

Public Class SMS_RECEIVED
    Inherits SMS
    Public SrcAddressLength As Byte
    Public SrcAddressType As Byte
    Public SrcAddressValue As String
    Public TP_SCTS As Date

    Sub New(ByVal PDUCode As String)
        Type = SMS.SMSType.SMS_RECEIVED
        GetOrignalData(PDUCode)
    End Sub
    Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
        SCAddressLength = GetByte(PDUCode)
        SCAddressType = GetByte(PDUCode)
        SCAddressValue = GetAddress((GetString(PDUCode, (SCAddressLength - 1) * 2)))
        FirstOctet = GetByte(PDUCode)

        SrcAddressLength = GetByte(PDUCode)
        SrcAddressType = GetByte(PDUCode)
        SrcAddressLength += SrcAddressLength Mod 2
        SrcAddressValue = GetAddress((GetString(PDUCode, SrcAddressLength)))


        TP_PID = GetByte(PDUCode)
        TP_DCS = GetByte(PDUCode)
        TP_SCTS = GetDate(GetString(PDUCode, 14))
        TP_UDL = GetByte(PDUCode)
        TP_UD = GetString(PDUCode, TP_UDL * 2)
    End Sub
End Class

Public Class SMS_SUBMIT
    Inherits SMS
    Public TP_MR As Byte
    Public DesAddressLength As Byte
    Public DesAddressType As Byte
    Public DesAddressValue As String
    Public TP_VP As Byte
    Sub New(ByVal PDUCode As String)
        Type = SMS.SMSType.SMS_SUBMIT
        GetOrignalData(PDUCode)
    End Sub

    Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
        SCAddressLength = GetByte(PDUCode)
        SCAddressType = GetByte(PDUCode)
        SCAddressValue = GetAddress((GetString(PDUCode, (SCAddressLength - 1) * 2)))
        FirstOctet = GetByte(PDUCode)

        TP_MR = GetByte(PDUCode)

        DesAddressLength = GetByte(PDUCode)
        DesAddressType = GetByte(PDUCode)
        DesAddressLength += DesAddressLength Mod 2
        DesAddressValue = GetAddress((GetString(PDUCode, DesAddressLength)))

        TP_PID = GetByte(PDUCode)
        TP_DCS = GetByte(PDUCode)
        TP_VP = GetByte(PDUCode)
        TP_UDL = GetByte(PDUCode)
        TP_UD = GetString(PDUCode, TP_UDL)
    End Sub
End Class

Public Class EMS_RECEIVED
    Inherits SMS_RECEIVED
    Public Structure InfoElem
        Public Identifier As Byte
        Public Length As Byte
        Public Data As String
    End Structure
    Public TP_UDHL As Byte

    Public IE() As InfoElem

    Sub New(ByVal PDUCode As String)
        MyBase.New(PDUCode)
    End Sub
    Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
        SCAddressLength = GetByte(PDUCode)
        SCAddressType = GetByte(PDUCode)
        SCAddressValue = GetAddress(GetString(PDUCode, (SCAddressLength - 1) * 2))
        FirstOctet = GetByte(PDUCode)

        SrcAddressLength = GetByte(PDUCode)
        SrcAddressType = GetByte(PDUCode)
        SrcAddressLength += SrcAddressLength Mod 2
        SrcAddressValue = GetAddress((GetString(PDUCode, SrcAddressLength)))

        TP_PID = GetByte(PDUCode)
        TP_DCS = GetByte(PDUCode)
        TP_SCTS = GetDate(GetString(PDUCode, 14))
        TP_UDL = GetByte(PDUCode)
        TP_UDHL = GetByte(PDUCode)

        IE = GetIE(GetString(PDUCode, TP_UDHL * 2))

        TP_UD = GetString(PDUCode, TP_UDL)
    End Sub

    Shared Function GetIE(ByVal IECode As String) As InfoElem()
        Dim tmp As String = IECode, t As Integer = 0
        Dim result() As InfoElem
        Do Until IECode = ""
            ReDim Preserve result(t)
            With result(t)
                .Identifier = GetByte(IECode)
                .Length = GetByte(IECode)
                .Data = GetString(IECode, .Length * 2)
            End With
            t += 1
        Loop
        Return result
    End Function
End Class

Public Class EMS_SUBMIT
    Inherits SMS_SUBMIT

    Sub New(ByVal PDUCode As String)
        MyBase.New(PDUCode)
        Type = SMS.SMSType.EMS_SUBMIT
    End Sub

    Public TP_UDHL As Byte

    Public IE() As EMS_RECEIVED.InfoElem


    Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
        SCAddressLength = GetByte(PDUCode)
        SCAddressType = GetByte(PDUCode)
        SCAddressValue = GetAddress(GetString(PDUCode, (SCAddressLength - 1) * 2))
        FirstOctet = GetByte(PDUCode)

        TP_MR = GetByte(PDUCode)

        DesAddressLength = GetByte(PDUCode)
        DesAddressType = GetByte(PDUCode)
        DesAddressLength += DesAddressLength Mod 2
        DesAddressValue = GetAddress(GetString(PDUCode, DesAddressLength))

        TP_PID = GetByte(PDUCode)
        TP_DCS = GetByte(PDUCode)
        TP_VP = GetByte(PDUCode)
        TP_UDL = GetByte(PDUCode)

        TP_UDHL = GetByte(PDUCode)
        IE = EMS_RECEIVED.GetIE(GetString(PDUCode, TP_UDHL * 2))

        TP_UD = GetString(PDUCode, TP_UDL * 2)
    End Sub
End Class

Public Class SMS_STATUS_REPORT
    Inherits SMS_RECEIVED
    Public TP_MR As Byte
    Public TP_DP As Date
    Public Status As Byte
    Sub New(ByVal PDUCode As String)
        MyBase.New(PDUCode)
        Type = SMS.SMSType.SMS_STATUS_REPORT
    End Sub
    Public Overrides Sub GetOrignalData(ByVal PDUCode As String)
        SCAddressLength = GetByte(PDUCode)
        SCAddressType = GetByte(PDUCode)
        SCAddressValue = GetAddress(GetString(PDUCode, (SCAddressLength - 1) * 2))

        FirstOctet = GetByte(PDUCode)

        TP_MR = GetByte(PDUCode)

        SrcAddressLength = GetByte(PDUCode)
        SrcAddressType = GetByte(PDUCode)
        SrcAddressLength += SrcAddressLength Mod 2
        SrcAddressValue = GetAddress(GetString(PDUCode, SrcAddressLength))

        TP_SCTS = GetDate(GetString(PDUCode, 14))
        TP_DP = GetDate(GetString(PDUCode, 14))

        Status = GetByte(PDUCode)
    End Sub
End Class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -