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

📄 decode85.pas

📁 pdf文件中Decode85压缩流的解密程序
💻 PAS
字号:
unit Decode85;

// wiss文档协同系统
// PDF 文件中的ASCII85解密程序
// 2008-10-20 王春晨

interface

uses SysUtils, Windows, Classes, Math, Types;

type
    TDecode85 = class
    private
        n, index: Integer;
        outdata: PByte;

        procedure wput(tuple: Cardinal; num: byte);
        procedure Decode85(Bt: PByte; Len: Integer); //Transform
    public
    	function Decode(Bt: PByte; Len: Integer; var Rs: PByte): Integer; overload;
        function Decode(InStream, OutStream: TMemoryStream): Integer; overload;
    end;

implementation

const pow85: array[0..4] of Cardinal = (85 * 85 * 85 * 85, 85 * 85 * 85, 85 * 85, 85, 1);

procedure TDecode85.Wput(tuple: Cardinal; num: byte);
var I: Integer;
begin
    for I := 1 to Num do begin
     	outdata^ := tuple shr ((4 - I) * 8);
        Inc(outdata);
		Inc(index);
    end;
end;

procedure TDecode85.Decode85(Bt: PByte; Len: Integer);
var I: Integer;
    b1, b2: Byte;
    tuple: Cardinal;
begin
    n := 0;
    tuple := 0;

    for I := 0 to Len - 1 do begin
        b1 := Bt^;
        Inc(Bt);

        case b1 of
            122: begin  //z
                    if n <> 0 then
                        Break;
                    Wput(0, 4)
                end;

            126: begin  //'~'
                    b2 := Bt^;
                    if b2 = Byte('>') then begin
                       	if n > 0 then begin
                        	Dec(n);;
							tuple := tuple + pow85[n];
							wput(tuple, n);
                        end;
                    end;
                    Break;
                end;

            10, 13, 32, 0, 9: Continue;
        else
        	if (b1 < 33) or (b1 > 117) then  //'!'  'u'
            	Break;

            tuple := tuple + pow85[n] * (b1 - 33);
            Inc(n);

            if n = 5 then begin
            	wput(tuple, 4);
            	tuple := 0;
                n := 0;
            end;
        end;
    end;
end;

function TDecode85.Decode(Bt: PByte; Len: Integer; var Rs: PByte): Integer;
var I, Ik: Integer;
	Tp: PByte;
begin
	Tp := Bt;
	//得到压缩流中 ‘z’ 的个数,因为一个 byte(z) 变为一个 integer(0)
	Ik := 0;
    for I := 0 to Len - 1 do begin
    	if Tp^ = 122 then
        	Inc(Ik);
        Inc(Tp);
    end;

	index := 0;
    Rs := Allocmem(Len + 4 * Ik);
	outdata := Rs;
    Decode85(Bt, Len);
    Result := Index;
end;

function TDecode85.Decode(InStream, OutStream: TMemoryStream): Integer;
var I, Ik: Integer;
	Tp: PByte;
begin
	Tp := InStream.Memory;
	Ik := 0;
    for I := 0 to InStream.Size - 1 do begin
    	if Tp^ = 122 then
        	Inc(Ik);
        Inc(Tp);
    end;

	index := 0;
    OutStream.Size := InStream.Size + 4 * Ik;
	outdata := OutStream.Memory;
    Decode85(InStream.Memory, InStream.Size);
    Result := Index;
end;

end.

⌨️ 快捷键说明

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