function kBase64Encode(const S: String;iType:Integer=0): String; const BASE_64_CHARSET='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var //Knight.Chen xe5 验证通过了!!! R, C : Byte; F, L, M, N, U : Integer; P : PAnsiChar; s1,sAnsiResult,xx:AnsiString; begin
xx:=BASE_64_CHARSET;
s1:=AnsiString(s);
L := Length(S1); if L > 0 then begin M := L mod 3; N := (L div 3) * 4 + M; if M > 0 then Inc(N); U := N mod 4; if U > 0 then begin U := 4 - U; Inc(N, U); end; SetLength(sAnsiResult, N); P := Pointer(sAnsiResult); R := 0; for F := 0 to L - 1 do begin C := Byte(S1 [F + 1]); case F mod 3 of 0 : begin P^ := xx[C shr 2 + 1]; Inc(P); R := (C and 3) shl 4; end; 1 : begin P^ := xx[C shr 4 + R + 1]; Inc(P); R := (C and $0F) shl 2; end; 2 : begin P^ := xx[C shr 6 + R + 1]; Inc(P); P^ := xx[C and $3F + 1]; Inc(P); end; end; end; if M > 0 then begin P^ := xx[R + 1]; Inc(P); end; for F := 1 to U do begin P^ := '='; Inc(P); end; end else sAnsiResult := '';
function kBase64Encode_UTF8(const S: String): String; const BASE_64_CHARSET ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var R, C : Byte; F, L, M, N, U : Integer; P : PAnsiChar; sAnsiResult,xx:AnsiString; s1:UTF8String; begin //Knight.Chen xe5 验证通过了!!! xx:=AnsiString(BASE_64_CHARSET);
s1:=UTF8String(s); //这里,必须先把传进来的STRING,转为为UTF8,
L := Length(S1); if L > 0 then begin M := L mod 3; N := (L div 3) * 4 + M; if M > 0 then Inc(N); U := N mod 4; if U > 0 then begin U := 4 - U; Inc(N, U); end; SetLength(sAnsiResult, N); P := Pointer(sAnsiResult); R := 0; for F := 0 to L - 1 do begin C := Byte(S1 [F + 1]); case F mod 3 of 0 : begin P^ := xx[C shr 2 + 1]; Inc(P); R := (C and 3) shl 4; end; 1 : begin P^ := xx[C shr 4 + R + 1]; Inc(P); R := (C and $0F) shl 2; end; 2 : begin P^ := xx[C shr 6 + R + 1]; Inc(P); P^ := xx[C and $3F + 1]; Inc(P); end; end; end; if M > 0 then begin P^ := xx[R + 1]; Inc(P); end; for F := 1 to U do begin P^ := '='; Inc(P); end; end else sAnsiResult := '';
Result:=string(sAnsiResult); end;
function kBase64Decode_UTF8(const S: String): String; const BASE_64_CHARSET ='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var F, L, M, P: Integer; B, OutPos: Byte; OutB: Array[1..3] of Byte; Lookup: Array[Char] of Byte; R: PAnsiChar; s1,xx:AnsiString; sUTF8Result:UTF8String; begin //Knight.Chen xe5 验证通过了!!!
xx:=AnsiString(BASE_64_CHARSET);
s1:=AnsiString(s);
L := Length(S1); P := 0; while (L - P > 0) and (S1[L - P] = '=') do Inc(P); M := L - P; if M <> 0 then begin SetLength(sUTF8Result, (M * 3) div 4); FillChar(Lookup, Sizeof(Lookup), #0); for F := 0 to 63 do Lookup[xx[F + 1]] := F; R := Pointer(sUTF8Result); OutPos := 0; for F := 1 to L - P do begin B := Lookup[S1[F]]; case OutPos of 0 : OutB[1] := B shl 2; 1 : begin OutB[1] := OutB[1] or (B shr 4); R^ := AnsiChar(OutB[1]); Inc(R); OutB[2] := (B shl 4) and $FF; end; 2 : begin OutB[2] := OutB[2] or (B shr 2); R^ := AnsiChar(OutB[2]); Inc(R); OutB[3] := (B shl 6) and $FF; end; 3 : begin OutB[3] := OutB[3] or B; R^ := AnsiChar(OutB[3]); Inc(R); end; end; OutPos := (OutPos + 1) mod 4; end; if (OutPos > 0) and (P = 0) then if OutB[OutPos] <> 0 then sUTF8Result := sUTF8Result + AnsiChar(OutB[OutPos]); end else sUTF8Result := '';