VB6下BASE64转换

简介: Option Explicit<br><br>Private Const BASE64CHR         As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="<br>Private psBase64Chr(0 To 63)    As String<br><br>'从一个经过Base6
Option Explicit

Private Const BASE64CHR         As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
Private psBase64Chr(0 To 63)    As String

'从一个经过Base64的字符串中解码到源字符串
Public Function DecodeBase64String(str2Decode As String) As String
    DecodeBase64String = StrConv(DecodeBase64Byte(str2Decode), vbUnicode)
End Function

'从一个经过Base64的字符串中解码到源字节数组
Public Function DecodeBase64Byte(str2Decode As String) As Byte()

    Dim lPtr            As Long
    Dim iValue          As Integer
    Dim iLen            As Integer
    Dim iCtr            As Integer
    Dim Bits(1 To 4)    As Byte
    Dim strDecode       As String
    Dim str             As String
    Dim Output()        As Byte
    
    Dim iIndex          As Long

    Dim lFrom As Long
    Dim lTo As Long
    
    InitBase
    
    '//除去回车
    str = Replace(str2Decode, vbCrLf, "")

    '//每4个字符一组(4个字符表示3个字)
    For lPtr = 1 To Len(str) Step 4
        iLen = 4
        For iCtr = 0 To 3
            '//查找字符在BASE64字符串中的位置
            iValue = InStr(1, BASE64CHR, Mid$(str, lPtr + iCtr, 1), vbBinaryCompare)
            Select Case iValue  'A~Za~z0~9+/
                Case 1 To 64:
                    Bits(iCtr + 1) = iValue - 1
                Case 65         '=
                    iLen = iCtr
                    Exit For
                    '//没有发现
                Case 0: Exit Function
            End Select
        Next

        '//转换4个6比特数成为3个8比特数
        Bits(1) = Bits(1) * &H4 + (Bits(2) And &H30) / &H10
        Bits(2) = (Bits(2) And &HF) * &H10 + (Bits(3) And &H3C) / &H4
        Bits(3) = (Bits(3) And &H3) * &H40 + Bits(4)

        '//计算数组的起始位置
        lFrom = lTo
        lTo = lTo + (iLen - 1) - 1
                
        '//重新定义输出数组
        ReDim Preserve Output(0 To lTo)
        
        For iIndex = lFrom To lTo
            Output(iIndex) = Bits(iIndex - lFrom + 1)
        Next

        lTo = lTo + 1
        
    Next
    DecodeBase64Byte = Output
End Function



'将一个字节数组进行Base64编码,并返回字符串
Public Function EncodeBase64Byte(sValue() As Byte) As String
    Dim lCtr                As Long
    Dim lPtr                As Long
    Dim lLen                As Long
    Dim sEncoded            As String
    Dim Bits8(1 To 3)       As Byte
    Dim Bits6(1 To 4)       As Byte
    
    Dim i As Integer
    
    InitBase

    For lCtr = 1 To UBound(sValue) + 1 Step 3
        For i = 1 To 3
            If lCtr + i - 2 <= UBound(sValue) Then
                Bits8(i) = sValue(lCtr + i - 2)
                lLen = 3
            Else
                Bits8(i) = 0
                lLen = lLen - 1
            End If
        Next

        '//转换字符串为数组,然后转换为4个6位(0-63)
        Bits6(1) = (Bits8(1) And &HFC) / 4
        Bits6(2) = (Bits8(1) And &H3) * &H10 + (Bits8(2) And &HF0) / &H10
        Bits6(3) = (Bits8(2) And &HF) * 4 + (Bits8(3) And &HC0) / &H40
        Bits6(4) = Bits8(3) And &H3F

        '//添加4个新字符
        For lPtr = 1 To lLen + 1
            sEncoded = sEncoded & psBase64Chr(Bits6(lPtr))
        Next
    Next

    '//不足4位,以=填充
    Select Case lLen + 1
        Case 2: sEncoded = sEncoded & "=="
        Case 3: sEncoded = sEncoded & "="
        Case 4:
    End Select

    EncodeBase64Byte = sEncoded
End Function


'对字符串进行Base64编码并返回字符串
Public Function EncodeBase64String(str2Encode As String) As String
    Dim sValue()            As Byte
    sValue = StrConv(str2Encode, vbFromUnicode)
    EncodeBase64String = EncodeBase64Byte(sValue)
End Function





Private Sub InitBase()
    Dim iPtr    As Integer
    '初始化 BASE64数组
    For iPtr = 0 To 63
        psBase64Chr(iPtr) = Mid$(BASE64CHR, iPtr + 1, 1)
    Next
End Sub

 
目录
相关文章
|
2月前
|
存储 安全 数据库
浅谈base64编码
浅谈base64编码
70 0
|
3月前
|
存储 XML 数据格式
深入理解Base64编码
【8月更文挑战第20天】
140 0
|
6月前
|
存储 算法 JavaScript
base64编码是啥?
base64编码是啥?
59 0
|
存储 索引
Base64编码
通过阅读本篇文章,你可以了解到: 1、Base64 编码的作用 2、Base64 编码的规则 3、Base64 索引表
228 0
Base64编码
|
C语言
PE格式:实现VA与FOA之间的转换
PE结构中的地址互转,这次再来系统的复习一下关于PE结构中各种地址的转换方式,最终通过编程来实现自动解析计算,最后将这个功能集成到我的迷你解析器中,本章中使用的工具是上次讲解PE结构文章中制作的CMD迷你结构解析器,如果不知道参数的基本使用请看前一篇。
160 0
PE格式:实现VA与FOA之间的转换
|
算法 数据安全/隐私保护
Qt中base64基础的应用
Qt中base64基础的应用
287 0
Qt中base64基础的应用
|
算法 区块链 索引
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
428 0
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(一)
|
算法 Android开发
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(二)
【密码学】Base64 编码 ( Base64 简介 | Base64 编码原理 | 最后编码组字节不足时补位 ‘=‘ 符号 | Base64 编码实现参考 )(二)
369 0
|
C# C++
16进制字符串转数字(C/C++,VB/VB.net,C#)
这个问题看是很简单,但是在不同语言中实现的方式却千差万别,如果不知道方法,还真是麻烦,我就是在C#中遇到该问题,让我费了很大的周折,才在msdn查到。
2207 0