base64.cls
上传用户:bcdefg2008
上传日期:2013-02-28
资源大小:144k
文件大小:4k
源码类别:

Email服务器

开发平台:

Visual Basic

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "base64"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15. Private Const CHAR_EQUAL As Byte = 61
  16. Private Const CHAR_CR As Byte = 13
  17. Private Const CHAR_LF As Byte = 10
  18. Private m_ReverseIndex1(0 To 255) As Byte
  19. Private m_ReverseIndex2(0 To 255, 0 To 1) As Byte
  20. Private m_ReverseIndex3(0 To 255, 0 To 1) As Byte
  21. Private m_ReverseIndex4(0 To 255) As Byte
  22. 'Decode a string to a string.
  23. Public Function Decode(sInput As String) As String
  24.   Dim bTemp() As Byte
  25.     'Convert to a byte array then convert.
  26.     'This is faster the repetitive calls to asc() or chr$()
  27.     bTemp = StrConv(sInput, vbFromUnicode)
  28.     Decode = StrConv(DecodeArr(bTemp), vbUnicode)
  29. End Function
  30. Public Sub DecodeToFile(sInput As String, sOutputFile As String)
  31.   Dim bTemp() As Byte
  32.   Dim fh As Long
  33.     bTemp = StrConv(sInput, vbFromUnicode)
  34.     bTemp = DecodeArr(bTemp)
  35.     fh = FreeFile(0)
  36.     Open sOutputFile For Binary Access Write As fh
  37.     Put fh, , bTemp
  38.     Close fh
  39. End Sub
  40. Public Sub DecodeFile(sInputFile As String, sOutputFile As String)
  41.   Dim bTemp() As Byte
  42.   Dim fh As Long
  43.     fh = FreeFile(0)
  44.     Open sInputFile For Binary Access Read As fh
  45.     ReDim bTemp(0 To LOF(fh) - 1)
  46.     Get fh, , bTemp
  47.     Close fh
  48.     bTemp = DecodeArr(bTemp)
  49.     Open sOutputFile For Binary Access Write As fh
  50.     Put fh, , bTemp
  51.     Close fh
  52. End Sub
  53. Private Function DecodeArr(bInput() As Byte) As Byte()
  54.   Dim bOutput() As Byte
  55.   Dim OutLength As Long
  56.   Dim CurrentOut As Long
  57.   Dim k As Long
  58.   Dim l As Long
  59.   Dim I As Long
  60.   
  61.   Dim b As Byte
  62.   Dim c As Byte
  63.   Dim d As Byte
  64.   Dim e As Byte
  65.     k = LBound(bInput)
  66.     l = UBound(bInput)
  67.     'Calculate the length of the input
  68.     I = l - k + 1
  69.     'Allocate the output
  70.   Dim BytesDataIn As Long ':(燤ove line to top of current Function
  71.   Dim BytesDataOut As Long ':(燤ove line to top of current Function
  72.   Dim ExtraBytes As Integer ':(燤ove line to top of current Function
  73.     If bInput(l) = 61 Then
  74.         ExtraBytes = 1
  75.         If bInput(l - 1) = 61 Then
  76.             ExtraBytes = 2
  77.         End If
  78.     End If
  79.     BytesDataIn = l + 1 'BytesDataIn of the string
  80.     BytesDataOut = (BytesDataIn * 0.75) - ExtraBytes ' how many bytes will the decoded string have
  81.     ReDim bOutput(BytesDataOut - 1)
  82.     CurrentOut = 0
  83.     For I = k To l
  84.         Select Case bInput(I)
  85.           Case CHAR_CR
  86.             'Do nothing
  87.           Case CHAR_LF
  88.             'Do nothing
  89.           Case Else
  90.             If l - I >= 3 Then
  91.                 b = bInput(I)
  92.                 c = bInput(I + 1)
  93.                 d = bInput(I + 2)
  94.                 e = bInput(I + 3)
  95.                 If e <> CHAR_EQUAL Then
  96.                     bOutput(CurrentOut) = m_ReverseIndex1(b) Or m_ReverseIndex2(c, 0)
  97.                     bOutput(CurrentOut + 1) = m_ReverseIndex2(c, 1) Or m_ReverseIndex3(d, 0)
  98.                     bOutput(CurrentOut + 2) = m_ReverseIndex3(d, 1) Or m_ReverseIndex4(e)
  99.                     CurrentOut = CurrentOut + 3
  100.                     I = I + 3 ':(燤odifies active For-Variable
  101.                   ElseIf d <> CHAR_EQUAL Then 'NOT E...
  102.                     bOutput(CurrentOut) = m_ReverseIndex1(b) Or m_ReverseIndex2(c, 0)
  103.                     bOutput(CurrentOut + 1) = m_ReverseIndex2(c, 1) Or m_ReverseIndex3(d, 0)
  104.                     CurrentOut = CurrentOut + 2
  105.                     I = I + 3 ':(燤odifies active For-Variable
  106.                   Else 'NOT D...
  107.                     bOutput(CurrentOut) = m_ReverseIndex1(b) Or m_ReverseIndex2(c, 0)
  108.                     CurrentOut = CurrentOut + 1
  109.                     I = I + 3 ':(燤odifies active For-Variable
  110.                 End If
  111.               Else 'NOT L...
  112.                 'Possible input code error, but may also be
  113.                 'an extra CrLf, so we will ignore it.
  114.             End If
  115.         End Select
  116.     Next I
  117.     'On properly formed input we should have to do this.
  118.     If OutLength <> CurrentOut + 1 Then
  119.         ReDim Preserve bOutput(0 To CurrentOut - 1)
  120.     End If
  121.     DecodeArr = bOutput
  122. End Function