敬业的IT人 >> 编程开发 >> .Net技术 >> 给贝贝的,Base64编码(带有Q和B编码)——VB.NET

给贝贝的,Base64编码(带有Q和B编码)——VB.NET

敬业的IT人 互联网 佚名 2008-5-23 17:39:39

  Option Strict Off
Option Explicit On
Option Compare Text
Imports Microsoft.VisualBasic.Compatibility
Namespace Blood.Com.ClassLib
    Public Class Security

        Private pbBase64Byt(63) As Byte

        Private Const BASE64CHR As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="

        Private Const Q_CODE_HDR As String = "=?ISO-8859-1?Q?"
        Private Const B_CODE_HDR As String = "=?ISO-8859-1?B?"
        Private Const CODE_END As String = "?="

        Public Sub New()
            MyBase.New()
            Dim intPtr As Integer
            For intPtr = 0 To 63
                pbBase64Byt(intPtr) = Asc(Mid(BASE64CHR, intPtr + 1, 1))
            Next
        End Sub

        Protected Overrides Sub Finalize()
            MyBase.Finalize()
        End Sub

        '对字符串进行B或Q编码
        Public Function EnText(ByRef sIn As String) As String
            Dim iPtr As Short
            Dim bNeedsEncoding As Boolean
            Dim iMax As Short
            Dim sChr As String
            Dim sLine As String
            Dim sQCode As String
            Dim sBCode As String
            Dim bytTmp() As Byte
            bytTmp = System.Text.UnicodeEncoding.Default.GetBytes(sIn)
            For iPtr = 0 To UBound(bytTmp)
                If bytTmp(iPtr) > 126 Then
                    bNeedsEncoding = True
                    Exit For
                End If
            Next
            EnText = sIn

            'Q 编码
            iMax = 54
            For iPtr = 1 To Len(sIn)
                sChr = Mid(sIn, iPtr, 1)
                Select Case Asc(sChr)
                    Case 33 To 60, 62, 64 To 94, 96 To 126
                        sLine = sLine & sChr
                    Case 32
                        sLine = sLine & "_"
                    Case Else
                        sLine = sLine & "=" & Right("00" & Hex(Asc(sChr)), 2)
                End Select
                If Len(sLine) >= iMax Then
                    sQCode = sQCode & Q_CODE_HDR & sLine & CODE_END
                    If iPtr < Len(sIn) Then sQCode = sQCode & vbCrLf & vbTab
                    sLine = ""
                End If
            Next
            sQCode = sQCode & Q_CODE_HDR & sLine & CODE_END

            'B 编码
            iMax = 42
            sLine = sIn
            Do While Len(sLine)
                sBCode = sBCode & B_CODE_HDR & Encode(Mid(sLine, 1, iMax))
                sBCode = Mid(sBCode, 1, Len(sBCode) - 2) & CODE_END
                sLine = Mid(sLine, iMax + 1)
                If Len(sLine) Then sBCode = sBCode & vbCrLf & vbTab
            Loop

            If Len(sQCode) < Len(sBCode) Then
                EnText = sQCode
            Else
                EnText = sBCode
            End If

        End Func 更多文章
粤ICP备06119539号
Copyright CiscoSky.Org,Some Rights Reserved.
Email:me1228#tom.com