⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nm64encode.pas

📁 DELPHI里面一些常用的控件
💻 PAS
字号:
unit NM64Encode;

interface
uses
  Classes;

function B64Encode(const source, destination: TStream): Boolean;

implementation
uses
  NMFileBuffer;

var
  B64Table: array[0..63] of Char =
  ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
    'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
    'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
    'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
    'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
    'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
    'w', 'x', 'y', 'z', '0', '1', '2', '3',
    '4', '5', '6', '7', '8', '9', '+', '/');

function B64Encode(const source, destination: TStream): Boolean;
var
  Counter: LongInt;
  TotalBytes: LongInt;

  EOD: Char;
  B64Char: Char;
  Char1: Char;
  Char2: Char;
  Char3: Char;

  InputPtr, OutputPtr, BufferEnd: PChar;

  MemStuff: TNMFileBuffer;

  Output: string;
  Len: Integer;
begin
  Counter := 0;
  TotalBytes := source.Size;

  EOD := '=';
  Len := 62;
  Output := '';
  SetLength(Output, Len);
  OutputPtr := PChar(Output);

  destination.Seek(0, soFromEnd);

  MemStuff := TNMFileBuffer.Create(source);
  try
    InputPtr := MemStuff.BufPos;
    BufferEnd := MemStuff.BufEnd;
    while True do
    begin
      if InputPtr >= BufferEnd then
        if not MemStuff.NextMemoryBuffer(InputPtr, 0) then
          Break
        else
        begin
          InputPtr := MemStuff.BufPos;
          BufferEnd := MemStuff.BufEnd;
        end;
      Char1 := InputPtr^;
      inc(InputPtr);
      B64Char := B64Table[Byte(Char1) shr 2];
      OutputPtr^ := B64Char;
      inc(OutputPtr);
      inc(Counter);

      if Counter >= TotalBytes then
      begin
        Char2 := #0;
        B64Char := B64Table[(((Byte(Char1) and $03) shl 4) or ((Byte(Char2) and $F0) shr 4))];
        OutputPtr^ := B64Char;
        inc(OutputPtr);
        OutputPtr^ := EOD;
        inc(OutputPtr);
        OutputPtr^ := EOD;
        inc(OutputPtr);
      end
      else
      begin
        if InputPtr >= BufferEnd then
          if not MemStuff.NextMemoryBuffer(InputPtr, 0) then
            Break
          else
          begin
            InputPtr := MemStuff.BufPos;
            BufferEnd := MemStuff.BufEnd;
          end;
        Char2 := InputPtr^;
        inc(InputPtr);
        B64Char := B64Table[(((Byte(Char1) and $03) shl 4) or ((Byte(Char2) and $F0) shr 4))];
        OutputPtr^ := B64Char;
        inc(OutputPtr);
        inc(Counter);

        if Counter >= TotalBytes then
        begin
          Char3 := #0;
          B64Char := B64Table[(((Byte(Char2) and $0F) shl 2) or ((Byte(Char3) and $C0) shr 6))];
          OutputPtr^ := B64Char;
          inc(OutputPtr);
          OutputPtr^ := EOD;
          inc(OutputPtr);
        end
        else
        begin
          if InputPtr >= BufferEnd then
            if not MemStuff.NextMemoryBuffer(InputPtr, 0) then
              Break
            else
            begin
              InputPtr := MemStuff.BufPos;
              BufferEnd := MemStuff.BufEnd;
            end;
          Char3 := InputPtr^;
          inc(InputPtr);
          B64Char := B64Table[(((Byte(Char2) and $0F) shl 2) or ((Byte(Char3) and $C0) shr 6))];
          OutputPtr^ := B64Char;
          inc(OutputPtr);
          inc(Counter);
          B64Char := B64Table[(Byte(Char3) and $3F)];
          OutputPtr^ := B64Char;
          inc(OutputPtr);
        end;
      end;

      if (Counter mod 45 = 0) or ((OutputPtr - 1)^ = EOD) then
      begin
        if ((OutputPtr - 1)^ <> EOD) then
        begin
          OutputPtr^ := #13;
          inc(OutputPtr);
          OutputPtr^ := #10;
          inc(OutputPtr);
          OutputPtr^ := #0;
        end
        else
        begin
          Len := LongInt(OutputPtr) - LongInt(Output);
          SetLength(Output, Len);
        end;
        destination.Write(PChar(Output)^, Len);
        OutputPtr := PChar(Output);
      end;
    end;
  finally
    MemStuff.Free;
  end;

  Len := LongInt(OutputPtr) - LongInt(Output);
  if Len > 0 then
  begin
    SetLength(Output, Len);
    destination.Write(PChar(Output)^, Len);
  end;

  destination.Write(EOD, 1);
  result := True;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -