热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

base64d2010版

代码{*******************************************************}{}{DelphiVisualComponentLibrary
ExpandedBlockStart.gif代码
{*******************************************************}
{                                                       }
{            Delphi Visual Component Library            }
{                                                       }
{ Copyright(c) 1995-2010 Embarcadero Technologies, Inc. }
{                                                       }
{*******************************************************}

unit EncdDecd;

interface

uses Classes, SysUtils;

procedure EncodeStream(Input, Output: TStream);
procedure DecodeStream(Input, Output: TStream);
function  EncodeString(const Input: string): string;
function  DecodeString(const Input: string): string;

function  DecodeBase64(const Input: AnsiString): TBytes;
function  EncodeBase64(const Input: Pointer; Size: Integer): AnsiString;

implementation

uses RTLConsts;

const
  EncodeTable: 
array[0..63of AnsiChar =
    AnsiString(
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'+
    AnsiString(
'abcdefghijklmnopqrstuvwxyz'+
    AnsiString(
'0123456789+/');

  DecodeTable: 
array[#0..#127of Integer = (
    Byte(
'='), 646464646464646464646464646464,
           
64646464646464646464646464646464,
           
64646464646464646464646264646463,
           
52535455565758596061646464646464,
           
64,  0,  1,  2,  3,  4,  5,  6,  7,  8,  91011121314,
           
15161718192021222324256464646464,
           
64262728293031323334353637383940,
           
41424344454647484950516464646464);

type
  PPacket 
= ^TPacket;
  TPacket 
= packed record
    
case Integer of
      
0: (b0, b1, b2, b3: Byte);
      
1: (i: Integer);
      
2: (a: array[0..3of Byte);
      
3: (c: array[0..3of AnsiChar);
  
end;

  TPointerStream 
= class(TCustomMemoryStream)
  
public
    
constructor Create(P: Pointer; Size: Integer);
    
function Write(const Buffer; Count: Longint): Longint; override;
  
end;

procedure EncodePacket(const Packet: TPacket; NumChars: Integer; OutBuf: PAnsiChar);
begin
  OutBuf[
0] := EnCodeTable[Packet.a[0shr 2];
  OutBuf[
1] := EnCodeTable[((Packet.a[0shl 4or (Packet.a[1shr 4)) and $0000003f];
  
if NumChars < 2 then
    OutBuf[
2] :&#61; &#39;&#61;&#39;
  
else OutBuf[2] :&#61; EnCodeTable[((Packet.a[1shl 2or (Packet.a[2shr 6)) and $0000003f];
  
if NumChars < 3 then
    OutBuf[
3] :&#61; &#39;&#61;&#39;
  
else OutBuf[3] :&#61; EnCodeTable[Packet.a[2and $0000003f];
end;

function DecodePacket(InBuf: PAnsiChar; var nChars: Integer): TPacket;
begin
  Result.a[
0] :&#61; (DecodeTable[InBuf[0]] shl 2or
    (DecodeTable[InBuf[
1]] shr 4);
  NChars :
&#61; 1;
  
if InBuf[2<> &#39;&#61;&#39; then
  
begin
    Inc(NChars);
    Result.a[
1] :&#61; Byte((DecodeTable[InBuf[1]] shl 4or (DecodeTable[InBuf[2]] shr 2));
  
end;
  
if InBuf[3<> &#39;&#61;&#39; then
  
begin
    Inc(NChars);
    Result.a[
2] :&#61; Byte((DecodeTable[InBuf[2]] shl 6or DecodeTable[InBuf[3]]);
  
end;
end;

procedure EncodeStream(Input, Output: TStream);
type
  PInteger 
&#61; ^Integer;
var
  InBuf: 
array[0..509of Byte;
  OutBuf: 
array[0..1023of AnsiChar;
  BufPtr: PAnsiChar;
  I, J, K, BytesRead: Integer;
  Packet: TPacket;
begin
  K :
&#61; 0;
  
repeat
    BytesRead :
&#61; Input.Read(InBuf, SizeOf(InBuf));
    I :
&#61; 0;
    BufPtr :
&#61; OutBuf;
    
while I < BytesRead do
    
begin
      
if BytesRead - I < 3 then
        J :
&#61; BytesRead - I
      
else J :&#61; 3;
      Packet.i :
&#61; 0;
      Packet.b0 :
&#61; InBuf[I];
      
if J > 1 then
        Packet.b1 :
&#61; InBuf[I &#43; 1];
      
if J > 2 then
        Packet.b2 :
&#61; InBuf[I &#43; 2];
      EncodePacket(Packet, J, BufPtr);
      Inc(I, 
3);
      Inc(BufPtr, 
4);
      Inc(K, 
4);
      
if K > 75 then
      
begin
        BufPtr[
0] :&#61; #$0D;
        BufPtr[
1] :&#61; #$0A;
        Inc(BufPtr, 
2);
        K :
&#61; 0;
      
end;
    
end;
    Output.Write(Outbuf, BufPtr 
- PChar(&#64;OutBuf));
  
until BytesRead &#61; 0;
end;

procedure DecodeStream(Input, Output: TStream);
var
  InBuf: 
array[0..75of AnsiChar;
  OutBuf: 
array[0..60of Byte;
  InBufPtr, OutBufPtr: PAnsiChar;
  I, J, K, BytesRead: Integer;
  Packet: TPacket;

  
procedure SkipWhite;
  
var
    C: AnsiChar;
    NumRead: Integer;
  
begin
    
while True do
    
begin
      NumRead :
&#61; Input.Read(C, 1);
      
if NumRead &#61; 1 then
      
begin
        
if C in [&#39;0&#39;..&#39;9&#39;,&#39;A&#39;..&#39;Z&#39;,&#39;a&#39;..&#39;z&#39;,&#39;&#43;&#39;,&#39;/&#39;,&#39;&#61;&#39;then
        
begin
          Input.Position :
&#61; Input.Position - 1;
          Break;
        
end;
      
end else Break;
    
end;
  
end;

  
function ReadInput: Integer;
  
var
    WhiteFound, EndReached : Boolean;
    CntRead, Idx, IdxEnd: Integer;
  
begin
    IdxEnd:
&#61; 0;
    
repeat
      WhiteFound :
&#61; False;
      CntRead :
&#61; Input.Read(InBuf[IdxEnd], (SizeOf(InBuf)-IdxEnd));
      EndReached :
&#61; CntRead < (SizeOf(InBuf)-IdxEnd);
      Idx :
&#61; IdxEnd;
      IdxEnd :
&#61; CntRead &#43; IdxEnd;
      
while (Idx < IdxEnd) do
      
begin
        
if not (InBuf[Idx] in [&#39;0&#39;..&#39;9&#39;,&#39;A&#39;..&#39;Z&#39;,&#39;a&#39;..&#39;z&#39;,&#39;&#43;&#39;,&#39;/&#39;,&#39;&#61;&#39;]) then
        
begin
          Dec(IdxEnd);
          
if Idx < IdxEnd then
            Move(InBuf[Idx
&#43;1], InBuf[Idx], IdxEnd-Idx);
          WhiteFound :
&#61; True;
        
end
        
else
          Inc(Idx);
      
end;
    
until (not WhiteFound) or (EndReached);
    Result :
&#61; IdxEnd;
  
end;

begin
  
repeat
    SkipWhite;
    BytesRead :
&#61; ReadInput;
    InBufPtr :
&#61; InBuf;
    OutBufPtr :
&#61; &#64;OutBuf;
    I :
&#61; 0;
    
while I < BytesRead do
    
begin
      Packet :
&#61; DecodePacket(InBufPtr, J);
      K :
&#61; 0;
      
while J > 0 do
      
begin
        OutBufPtr^ :
&#61; AnsiChar(Packet.a[K]);
        Inc(OutBufPtr);
        Dec(J);
        Inc(K);
      
end;
      Inc(InBufPtr, 
4);
      Inc(I, 
4);
    
end;
    Output.Write(OutBuf, OutBufPtr 
- PAnsiChar(&#64;OutBuf));
  
until BytesRead &#61; 0;
end;

function EncodeString(const Input: string): string;
var
  InStr, OutStr: TStringStream;
begin
  InStr :
&#61; TStringStream.Create(Input);
  
try
    OutStr :
&#61; TStringStream.Create(&#39;&#39;);
    
try
      EncodeStream(InStr, OutStr);
      Result :
&#61; OutStr.DataString;
    
finally
      OutStr.Free;
    
end;
  
finally
    InStr.Free;
  
end;
end;

function DecodeString(const Input: string): string;
var
  InStr, OutStr: TStringStream;
begin
  InStr :
&#61; TStringStream.Create(Input);
  
try
    OutStr :
&#61; TStringStream.Create(&#39;&#39;);
    
try
      DecodeStream(InStr, OutStr);
      Result :
&#61; OutStr.DataString;
    
finally
      OutStr.Free;
    
end;
  
finally
    InStr.Free;
  
end;
end;

constructor TPointerStream.Create(P: Pointer; Size: Integer);
begin
  SetPointer(P, Size);
end;

function TPointerStream.Write(const Buffer; Count: Longint): Longint;
var
  Pos, EndPos, Size: Longint;
  Mem: Pointer;
begin
  Pos :
&#61; Self.Position;

  
if (Pos >&#61; 0and (Count > 0then
  
begin
    EndPos :
&#61; Pos &#43; Count;
    Size:
&#61; Self.Size;
    
if EndPos > Size then
      
raise EStreamError.CreateRes(&#64;SMemoryStreamError);

    Mem :
&#61; Self.Memory;
    System.Move(Buffer, Pointer(Longint(Mem) 
&#43; Pos)^, Count);
    Self.Position :
&#61; Pos;
    Result :
&#61; Count;
    Exit;
  
end;
  Result :
&#61; 0;
end;

function DecodeBase64(const Input: AnsiString): TBytes;
var
  InStr: TPointerStream;
  OutStr: TBytesStream;
  Len: Integer;
begin
  InStr :
&#61; TPointerStream.Create(PAnsiChar(Input), Length(Input));
  
try
    OutStr :
&#61; TBytesStream.Create;
    
try
      DecodeStream(InStr, OutStr);
      Result :
&#61; OutStr.Bytes;
      Len :
&#61; OutStr.Size;
    
finally
      OutStr.Free;
    
end;
  
finally
    InStr.Free;
  
end;
  SetLength(Result, Len);
end;

function EncodeBase64(const Input: Pointer; Size: Integer): AnsiString;
var
  InStr: TPointerStream;
  OutStr: TBytesStream;
begin  
  InStr :
&#61; TPointerStream.Create(Input, Size);
  
try
    OutStr :
&#61; TBytesStream.Create;
    
try
      EncodeStream(InStr, OutStr);
      SetString(Result, PAnsiChar(OutStr.Memory), OutStr.Size);
    
finally
      OutStr.Free;
    
end;
  
finally
    InStr.Free;
  
end;
end;


end.

 

转:https://www.cnblogs.com/jxgxy/archive/2010/01/04/1639084.html



推荐阅读
author-avatar
甄之恋
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有