求快速base64文件编码算法

lcabc 2003-09-23 04:03:37
求快速base64文件编码算法,我的算法是按字节读取文件进行编码,速度超慢,80K的文件需要1分钟才编码完,请各位大哥帮忙有没有快些的算法,我的算法中编码正确性已通过,唯一就是速度慢。
...全文
78 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
rainstormmaster 2003-09-23
  • 打赏
  • 举报
回复
此代码是一个 BCB 的单元,非常简单,提供了四个函数, 要改成 Delphi 或其它 C/C++ 也很容易,有需要的自已改吧。此代码经过测试,结果正确。

下面是头文件:

//---------------------------------------------------------------------------
// MIME & BASE64 Encode/Decode unit. (H)
// Copyright (c) 2000 Mental Studio - http://mentals.126.com
// Author : Raptor - raptorz@126.com
//---------------------------------------------------------------------------
#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 - raptorz@126.com
//---------------------------------------------------------------------------

#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;
}
//---------------------------------------------------------------------------

rainstormmaster 2003-09-23
  • 打赏
  • 举报
回复
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 here

for(i=0;i<destLen;i++)
printf("%c",*(pDest++));
}
else if(nChoice==2)
{}
else
{
return 0;
}
printf("\n");
return 1;
}
/////////////////////////////////////////////////////////

rainstormmaster 2003-09-23
  • 打赏
  • 举报
回复
既然是base64编码,就注定了要按字节处理,我们能做的只是进行代码优化,提高速度而已
lcabc 2003-09-23
  • 打赏
  • 举报
回复
早就试过这招了,这个方法其实还是按字节循环处理,1M要多少字节呀,读到内存中还是没快多少,大哥有没有C的代码,最多我写个api给vb调用就是了
kmzs 2003-09-23
  • 打赏
  • 举报
回复
绝倒
rainstormmaster 2003-09-23
  • 打赏
  • 举报
回复
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 Function

Private Sub Command1_Click()

Debug.Print Base64encode("中")

End Sub


Private Sub Form_Load()
charlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
End Sub

7,789

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧