Base64编码与解码的函数(50分)

  • 主题发起人 主题发起人 coolren
  • 开始时间 开始时间
C

coolren

Unregistered / Unconfirmed
GUEST, unregistred user!
下面是一个编码与解码的函数,可我真的看不懂,那位大哥能给我解释一下吗?


const BaseTable:string='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
//
function FindInTable(CSource:char):integer;
begin
result:=Pos(string(CSource),BaseTable)-1;
end;
////

function DecodeBase64(Source:string):string;
var
SrcLen,Times,i:integer;
x1,x2,x3,x4,xt:byte;
begin
result:='';
SrcLen:=Length(Source);
Times:=SrcLen div 4;
for i:=0 to Times-1 do
begin
x1:=FindInTable(Source[1+i*4]);
x2:=FindInTable(Source[2+i*4]);
x3:=FindInTable(Source[3+i*4]);
x4:=FindInTable(Source[4+i*4]);
x1:=x1 shl 2;
xt:=x2 shr 4;
x1:=x1 or xt;
x2:=x2 shl 4;
result:=result+chr(x1);
if x3= 64 then break;
xt:=x3 shr 2;
x2:=x2 or xt;
x3:=x3 shl 6;
result:=result+chr(x2);
if x4=64 then break;
x3:=x3 or x4;
result:=result+chr(x3);
end;
end;
/////

function EncodeBase64(Source:string):string;
var
Times,LenSrc,i:integer;
x1,x2,x3,x4:char;
xt:byte;
begin
result:='';
LenSrc:=length(Source);
if LenSrc mod 3 =0 then
Times:=LenSrc div 3
else
Times:=LenSrc div 3 + 1;
for i:=0 to times-1 do
begin
if LenSrc >= (3+i*3) then
begin
x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
xt:=(ord(Source[1+i*3]) shl 4) and 48;
xt:=xt or (ord(Source[2+i*3]) shr 4);
x2:=BaseTable[xt+1];
xt:=(Ord(Source[2+i*3]) shl 2) and 60;
xt:=xt or (ord(Source[3+i*3]) shr 6);
x3:=BaseTable[xt+1];
xt:=(ord(Source[3+i*3]) and 63);
x4:=BaseTable[xt+1];
end
else if LenSrc>=(2+i*3) then
begin
x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
xt:=(ord(Source[1+i*3]) shl 4) and 48;
xt:=xt or (ord(Source[2+i*3]) shr 4);
x2:=BaseTable[xt+1];
xt:=(ord(Source[2+i*3]) shl 2) and 60;
x3:=BaseTable[xt+1];
x4:='=';
end else
begin
x1:=BaseTable[(ord(Source[1+i*3]) shr 2)+1];
xt:=(ord(Source[1+i*3]) shl 4) and 48;
x2:=BaseTable[xt+1];
x3:='=';
x4:='=';
end;
result:=result+x1+x2+x3+x4;
end;
end;
 
只能看RFC的文档了。
应该是RFC1421吧
 
第一个函数是计算source在basetable里的位置,第二和第三个函数是功能相反的两个函数
大概就是把字符转换成函数所设定的编码,具体没句的解释可以拿函数表查看一下。
 
Base64编码与解码在RFC中用到最多,RFC是基于文本命令的(包括被传内容),那么如何
才能传非文本信息呢,就通过这两个函数来转换,其中的basetable决定了加码后的数据
范围,对于一般的文本,加码后还可以有一点压缩功能。
另一点,如果你的被解码字串过长,你也不能把它分段(加了回车换行),否则会解错
 
basetable决定是有效字符.只有在这里面的字符才可以被编码.
另,FindInTable函数是查找所要编码的字符是不是在basetable里面.也就是判断是不是合法字符.
 
这个方面的资料太多了,搜索一下吧
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1183300

这个贴应该可以让你明白BASE64的算法
 
多人接受答案了。
 

Similar threads

I
回复
0
查看
818
import
I
A
回复
0
查看
613
Andreas Hausladen
A
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部