求快速base64文件编码算法,我的算法是按字节读取文件进行编码,速度超慢,80K的文件需要1分钟才编码完,请各位大哥帮忙有没有快些的算法,我的算法中编码正确性已通过,唯一就是速度慢。

解决方案 »

  1.   

    Option Explicit
    Dim charlist As String
    Private Function Base64encode(ByVal s As String) As String
       Dim ByteArray() As Byte
       ByteArray = StrConv(s, vbFromUnicode) '将字串转为byte数组
       Dim tempstr As String
       Dim stemp As String
       Dim i As Long
       Dim j As Long, k As Long
       Dim num1 As Long, num2 As Long, num3 As Long, num4 As Long
       i = UBound(ByteArray)
       i = (i + 1) Mod 3
       Select Case i
       Case 0
            If s = vbNullString Then
                Base64encode = ""
                Exit Function
            End If
            For j = 0 To UBound(ByteArray) Step 3
                num1 = ByteArray(j) \ 2 ^ 2 '右移2位,即取前6位
                num2 = (ByteArray(j) And 3) * 2 ^ 4 + ByteArray(j + 1) \ 2 ^ 4
                num3 = (ByteArray(j + 1) And 15) * 2 ^ 2 + ByteArray(j + 2) \ 2 ^ 6
                num4 = ByteArray(j + 2) And 63
                stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & Mid(charlist, num4 + 1, 1)
                tempstr = tempstr + stemp
            Next
       Case 1
            For j = 0 To UBound(ByteArray) - 1 Step 3
                num1 = ByteArray(j) \ 2 ^ 2 '右移2位,即取前6位
                num2 = (ByteArray(j) And 3) * 2 ^ 4 + ByteArray(j + 1) \ 2 ^ 4
                num3 = (ByteArray(j + 1) And 15) * 2 ^ 2 + ByteArray(j + 2) \ 2 ^ 6
                num4 = ByteArray(j + 2) And 63
                stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & Mid(charlist, num4 + 1, 1)
                tempstr = tempstr + stemp
            Next
            '处理数组的最后1个元素
            k = UBound(ByteArray)
            num1 = ByteArray(k) \ 2 ^ 2
            num2 = (ByteArray(k) And 3) * 2 ^ 4
            stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & "=="
            tempstr = tempstr + stemp
       Case 2
            For j = 0 To UBound(ByteArray) - 2 Step 3
                num1 = ByteArray(j) \ 2 ^ 2 '右移2位,即取前6位
                num2 = (ByteArray(j) And 3) * 2 ^ 4 + ByteArray(j + 1) \ 2 ^ 4
                num3 = (ByteArray(j + 1) And 15) * 2 ^ 2 + ByteArray(j + 2) \ 2 ^ 6
                num4 = ByteArray(j + 2) And 63
                stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & Mid(charlist, num4 + 1, 1)
                tempstr = tempstr + stemp
            Next
            '处理数组的最后2个元素
            k = UBound(ByteArray)
            num1 = ByteArray(k - 1) \ 2 ^ 2 '右移2位,即取前6位
            num2 = (ByteArray(k - 1) And 3) * 2 ^ 4 + ByteArray(k) \ 2 ^ 4
            num3 = (ByteArray(k) And 15) * 2 ^ 2
            stemp = Mid(charlist, num1 + 1, 1) & Mid(charlist, num2 + 1, 1) & Mid(charlist, num3 + 1, 1) & "="
            tempstr = tempstr + stemp
       End Select
       
       Base64encode = tempstr
    End FunctionPrivate Sub Command1_Click()    Debug.Print Base64encode("中")End Sub
    Private Sub Form_Load()
        charlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    End Sub
      

  2.   

    早就试过这招了,这个方法其实还是按字节循环处理,1M要多少字节呀,读到内存中还是没快多少,大哥有没有C的代码,最多我写个api给vb调用就是了
      

  3.   

    既然是base64编码,就注定了要按字节处理,我们能做的只是进行代码优化,提高速度而已
      

  4.   

    c://Base64.h
    //////////////////// 
    class CBase64
    {
    public:
    CBase64(char* pSour);
    ~CBase64();
    public:
    void Encode();
    void Decode();
    public:
    char* pDes;
    public:
    int nSourLen;
    int nDestLen;
    private:
    char *pSr;
    };
    /////////////////////////////////////////////////////////////
    //Base64.cpp
    ////////////////////////////////
    #include "Base64.h"
    #include "stdio.h"
    #define NULL 0
    ////////////////////////////////
    CBase64::CBase64(char *pSour)
    {
    int nLen;
    for( nLen=0;*(pSour+nLen)!='\0';nLen++);
    nSourLen=nLen;
    pSr=pSour;
    }CBase64::~CBase64()
    {
    delete[] pDes;
    }void CBase64::Encode()
    {
    char *pD;
    if(!(nSourLen%3))
    nDestLen=(nSourLen/3)*4;
    else
    nDestLen=(nSourLen/3)*4+4;pDes=new char[nDestLen];
    pD=pDes;
    int i=0,group;
    char cMap[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 
    char ch,cha;
    group=nSourLen/3;do
    {
    ch=*pSr;
    ch=ch>>2;
    ch=ch&(0x3f);
    *(pDes++)=cMap[ch];
    ch=*pSr;
    cha=*(pSr+1);
    ch=ch<<4;
    ch=ch&(0x30);
    cha=cha>>4;
    cha=cha&(0x0f);
    cha+=ch;
    *(pDes++)=cMap[cha];
    ch=*(pSr+1);
    cha=*(pSr+2);
    ch=ch<<2;
    ch=ch&(0x3c);
    cha=cha>>6;
    cha=cha&(0x03);
    ch+=cha;
    *(pDes++)=cMap[ch];
    ch=*(pSr+2);
    ch=ch&(0x3f);
    *(pDes++)=cMap[ch];
    i++;
    pSr+=3;
    }while(i<group);if((nSourLen%3)==1)
    {
    ch=*pSr;
    ch=ch>>2;
    ch=ch&(0x3f);
    *(pDes++)=cMap[ch];
    ch=*pSr;
    ch=ch<<4;
    ch=ch&(0x30);
    *(pDes++)=cMap[ch];
    *(pDes++)='=';
    *(pDes)='=';
    }if((nSourLen%3)==2)
    {
    ch=*pSr;
    ch=ch>>2;
    ch=ch&(0x3f);
    *(pDes++)=cMap[ch];
    ch=*pSr;
    cha=*(pSr+1);
    ch=ch<<4;
    ch=ch&(0x30);
    cha=cha>>4;
    cha=cha&(0x0f);
    cha+=ch;
    *(pDes++)=cMap[cha];
    ch=(*pSr+1);
    ch=ch<<2;
    ch=ch&(0x3c);
    *(pDes++)=cMap[ch];
    *pDes='=';
    }
    pDes=pD;
    }
    ////////////////////////////////////////
    ///测试模块int main()
    {
    int nChoice;
    char str[80];
    int destLen;
    int i;
    char* pDest=NULL;printf("\n===============MINE/Base64 Encode&Decode Test Modual===============\n\n");
    printf(" 1,Encoding using MINE/Base64.\n");
    printf(" 2,Decoding using MINE/Base64.\n");
    printf(" Enter a choice:");
    scanf("%d",&nChoice);
    printf("Make sure what you input follows the standar format.\n");
    printf("String:");
    scanf("%s",str);CBase64 base(str);//Pay attention here
    if(nChoice==1)
    {base.Encode();//Pay attention here!
    pDest=base.pDes;//pay attention here
    destLen=base.nDestLen;//pay attention herefor(i=0;i<destLen;i++)
    printf("%c",*(pDest++));
    }
    else if(nChoice==2)
    {}
    else
    {
    return 0;
    }
    printf("\n");
    return 1;
    }
    /////////////////////////////////////////////////////////
      

  5.   

    此代码是一个 BCB 的单元,非常简单,提供了四个函数, 要改成 Delphi 或其它 C/C++ 也很容易,有需要的自已改吧。此代码经过测试,结果正确。 下面是头文件: //---------------------------------------------------------------------------
    // MIME & BASE64 Encode/Decode unit. (H)
    // Copyright (c) 2000 Mental Studio - http://mentals.126.com
    // Author : Raptor - [email protected]
    //---------------------------------------------------------------------------
    #ifndef mimeb64H
    #define mimeb64H
    //---------------------------------------------------------------------------AnsiString MimeEncode( AnsiString s );
    AnsiString MimeDecode( AnsiString s );
    AnsiString Base64Encode( AnsiString s );
    AnsiString Base64Decode( AnsiString s );
    //---------------------------------------------------------------------------
    #endif
    下面是 CPP 文件: //---------------------------------------------------------------------------
    // MIME & BASE64 Encode/Decode unit. (CPP)
    // Copyright (c) 2000 Mental Studio - http://mentals.126.com
    // Author : Raptor - [email protected]
    //---------------------------------------------------------------------------#include 
    #pragma hdrstop#include "mimeb64.h"//---------------------------------------------------------------------------
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    // 4bit binary to char 0-F
    char Hex2Chr( Byte n )
    {
    n &= 0xF;
    if ( n < 10 )
    return ( char )( n + '0' );
    else
    return ( char )( n - 10 + 'A' );
    }
    //---------------------------------------------------------------------------
    // char 0-F to 4bit binary
    Byte Chr2Hex( char c )
    {
    c = toupper( c );
    if ( c >= '0' && c <= '9' )
    return ( int )( c - '0' );
    else if ( c >= 'A' && c <= 'F' )
    return ( int )( c - 'A' + 10 );
    else
    return -1;
    }
    //---------------------------------------------------------------------------
    // Base64 code table
    // 0-63 : A-Z(25) a-z(51), 0-9(61), +(62), /(63)
    char __fastcall Base2Chr( Byte n )
    {
    n &= 0x3F;
    if ( n < 26 )
    return ( char )( n + 'A' );
    else if ( n < 52 )
    return ( char )( n - 26 + 'a' );
    else if ( n < 62 )
    return ( char )( n - 52 + '0' );
    else if ( n == 62 )
    return '+';
    else
    return '/';
    }
    //---------------------------------------------------------------------------
    Byte Chr2Base( char c )
    {
    if ( c >= 'A' && c <= 'Z' )
    return ( Byte )( c - 'A' );
    else if ( c >= 'a' && c <= 'z' )
    return ( Byte )( c - 'a' + 26 );
    else if ( c >= '0' && c <= '9' )
    return ( Byte )( c - '0' + 52 );
    else if ( c == '+' )
    return 62;
    else
    return 63;
    }
    //---------------------------------------------------------------------------
    //
    AnsiString MimeEncode( AnsiString s )
    {
    AnsiString asTemp = "";
    int i = 1, n = s.Length( );while ( i <= n )
    {
    asTemp += '=';
    asTemp += Hex2Chr( ( Byte )( s >> 4 ) );
    asTemp += Hex2Chr( ( Byte )( s ) );
    i++;
    }
    return asTemp;
    }
    //---------------------------------------------------------------------------
    //
    AnsiString MimeDecode( AnsiString s )
    {
    AnsiString asTemp = "";
    int i = 1, n = s.Length( );
    Byte ch, cl; // 因为有些软件(e.g.Foxmail)对一些 < 0x7f 的字符不编码,此函数作了一些修改while ( i <= n )
    {
    if ( ( s == '=' ) && ( i + 2 <= n ) )
    {
    ch = Chr2Hex( s[i + 1] );
    cl = Chr2Hex( s[i + 2] );
    if ( ( ch == ( Byte )-1 ) || ( cl == ( Byte )-1 ) )
    asTemp += s; // 未编码的'='
    else
    {
    asTemp += ( char )( ( ch << 4 ) | cl );
    i += 2;
    }
    }
    else
    asTemp += s; // 未编码的字符
    i++;
    }
    return asTemp;
    }
    //---------------------------------------------------------------------------
    //
    AnsiString Base64Encode( AnsiString s )
    {
    int n = s.Length( );
    Byte c, t;
    AnsiString asTemp = "";for ( int i = 1; i <= n; i++ )
    {
    c = s;
    if ( i % 3 == 1 )
    {
    asTemp += Base2Chr( c >> 2 );
    t = ( c << 4 ) & 0x3F;
    }
    else if ( i % 3 == 2 )
    {
    asTemp += Base2Chr( t | ( c >> 4 ) );
    t = ( c << 2 ) & 0x3F;
    }
    else
    {
    asTemp += Base2Chr( t | ( c >> 6 ) );
    asTemp += Base2Chr( c );
    }
    }
    if ( n % 3 != 0 )
    {
    asTemp += Base2Chr( t );
    if ( n % 3 == 1 )
    asTemp += "==";
    else
    asTemp += "=";
    }
    return asTemp;
    }
    //---------------------------------------------------------------------------
    //
    AnsiString Base64Decode( AnsiString s )
    {
    int n = s.Length( );
    Byte c, t;
    AnsiString asTemp = "";for ( int i = 1; i <= n; i++ )
    {
    if ( s == '=' )
    break;
    c = Chr2Base( s );
    if ( i % 4 == 1 )
    t = c << 2;
    else if ( i % 4 == 2 )
    {
    asTemp += ( char )( t | ( c >> 4 ) );
    t = ( Byte )( c << 4 );
    }
    else if ( i % 4 == 3 )
    {
    asTemp += ( char )( t | ( c >> 2 ) );
    t = ( Byte )( c << 6 );
    }
    else
    asTemp += ( char )( t | c );
    }
    return asTemp;
    }
    //---------------------------------------------------------------------------