Module_Base64.bas
上传用户:xmantailai
上传日期:2018-01-13
资源大小:31k
文件大小:3k
源码类别:

WEB邮件程序

开发平台:

Visual Basic

  1. Attribute VB_Name = "Module_Base64"
  2. Option Explicit
  3. Private Declare Function ArrPtr Lib "msvbvm60.dll" _
  4. Alias "VarPtr" (Ptr() As Any) As Long '<-- VB6
  5. Private Declare Sub PokeLng Lib "kernel32" Alias "RtlMoveMemory" ( _
  6. ByVal Addr As Long, Source As Long, _
  7. Optional ByVal Bytes As Long = 4)
  8. Private Base64EncodeByte(0 To 63) As Byte
  9. Private Base64EncodeWord(0 To 63) As Integer
  10. Const Base64EmptyByte As Byte = 61
  11. Const Base64EmptyWord As Integer = 61
  12. Public Sub Base64Init()
  13.   '建立Base64码数组
  14.   Const Chars64 As String _
  15.     = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" _
  16.     & "abcdefghijklmnopqrstuvwxyz" _
  17.     & "0123456789+/"
  18.   Static i As Long
  19.   Dim Code As Integer
  20.   If i Then Exit Sub
  21.   For i = 0 To 63
  22.     Code = Asc(Mid$(Chars64, i + 1, 1))
  23.     Base64EncodeByte(i) = Code
  24.     Base64EncodeWord(i) = Code
  25.   Next i
  26. End Sub
  27. Public Static Function Base64EncodeString(ByRef Text As String) As String
  28. 'Base64码转换函数
  29.   Dim Chars() As Integer
  30.   Dim SavePtr As Long
  31.   Dim SADescrPtr As Long
  32.   Dim DataPtr As Long
  33.   Dim CountPtr As Long
  34.   Dim TextLen As Long
  35.   Dim i As Long
  36.   Dim Chars64() As Integer
  37.   Dim SavePtr64 As Long
  38.   Dim SADescrPtr64 As Long
  39.   Dim DataPtr64 As Long
  40.   Dim CountPtr64 As Long
  41.   Dim TextLen64 As Long
  42.   Dim j As Long
  43.   Dim b1 As Integer
  44.   Dim b2 As Integer
  45.   Dim b3 As Integer
  46.   j = 0
  47.   TextLen = Len(Text)
  48.   If TextLen = 0 Then Exit Function
  49.   '输入字符串校验
  50.   TextLen64 = ((TextLen + 2)  3) * 4
  51.   '字符串转换为Base64码后的长度
  52.   Base64EncodeString = Space$(TextLen64)
  53.   If SavePtr = 0 Then
  54.     ReDim Chars(1 To 1)
  55.     SavePtr = VarPtr(Chars(1))
  56.     'SavePtr=*Chars(1)
  57.     PokeLng VarPtr(SADescrPtr), ByVal ArrPtr(Chars)
  58.     '*SADescrPtr=*Chars
  59.     DataPtr = SADescrPtr + 12
  60.     CountPtr = SADescrPtr + 16
  61.     ReDim Chars64(0 To 0)
  62.     SavePtr64 = VarPtr(Chars64(0))
  63.     'SavePtr64=*Chars64(0)
  64.     PokeLng VarPtr(SADescrPtr64), ByVal ArrPtr(Chars64)
  65.     '*SADescrPtr64=*Chars64
  66.     DataPtr64 = SADescrPtr64 + 12
  67.     CountPtr64 = SADescrPtr64 + 16
  68.   End If
  69.   PokeLng DataPtr, StrPtr(Text)
  70.   'DataPtr=*Text
  71.   PokeLng CountPtr, TextLen
  72.   'CountPtr=TextLen
  73.   PokeLng DataPtr64, StrPtr(Base64EncodeString)
  74.   'DataPtr64=*Base64EncodeString
  75.   PokeLng CountPtr64, TextLen64
  76.   'CountPtr64=Textlen64
  77.   Base64Init
  78.   '输入字符串转换为Base64码
  79.   For i = 1 To TextLen - 2 Step 3
  80.     b1 = Chars(i)
  81.     b2 = Chars(i + 1)
  82.     b3 = Chars(i + 2)
  83.     'Base64-Bytes:
  84.     Chars64(j) = Base64EncodeWord(b1  &H4)
  85.     Chars64(j + 1) = Base64EncodeWord((b1 And &H3) * &H10 + b2  &H10)
  86.     Chars64(j + 2) = Base64EncodeWord((b2 And &HF) * &H4 + b3  &H40)
  87.     Chars64(j + 3) = Base64EncodeWord(b3 And &H3F)
  88.     j = j + 4
  89.   Next i
  90.   '继续将未转换完的输入字符串转换为Base64码
  91.   Select Case TextLen - i
  92.     Case 0 '2 Bytes
  93.       b1 = Chars(i)
  94.       Chars64(j) = Base64EncodeWord(b1  &H4)
  95.       Chars64(j + 1) = Base64EncodeByte((b1 And &H3) * &H10)
  96.       Chars64(j + 2) = Base64EmptyWord
  97.       Chars64(j + 3) = Base64EmptyWord
  98.     Case 1 '1 Byte
  99.       b1 = Chars(i)
  100.       b2 = Chars(i + 1)
  101.       Chars64(j) = Base64EncodeWord(b1  &H4)
  102.       Chars64(j + 1) = Base64EncodeWord((b1 And &H3) * &H10 + b2  &H10)
  103.       Chars64(j + 2) = Base64EncodeWord((b2 And &HF) * &H4)
  104.       Chars64(j + 3) = Base64EmptyWord
  105.   End Select
  106.   '返回转换成Base64码的字符串
  107.   PokeLng DataPtr64, SavePtr64
  108.   PokeLng CountPtr64, 1
  109.   PokeLng DataPtr, SavePtr
  110.   PokeLng CountPtr, 1
  111. End Function