📄 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 + -