?? asciireplace.pas
字號(hào):
unit ASCIIReplace;
interface
uses CarrierFile, DataFile, Classes, sysutils
{$IFDEF CLX}
,QForms, QDialogs
{$ELSE}
,Forms, Dialogs
{$ENDIF}
;
type
TASCIIReplace = class(TCarrierFile)
public
constructor Create; override;
destructor Destroy; override;
function GetAvailSize: Longint; virtual;
function CreateFromCarrierFile(cf: TCarrierFile): Boolean; virtual;
function ExportToCarrierFile(cf: TCarrierFile): Boolean; virtual;
function EnoughSpaceToHide(n: Longint): Boolean; virtual;
function Encode(ToHide: TDataFile): Boolean; virtual;
function Decode(ResultFile: TDataFile): Boolean; virtual;
end;
implementation
constructor TASCIIReplace.Create;
begin
inherited Create;
end;
destructor TASCIIReplace.Destroy;
begin
inherited Create;
end;
function TASCIIReplace.GetAvailSize: Longint;
var
Buffer: Array[0..1023] of Byte;
BytesRead: Integer;
Hex20: Integer;
i: Integer;
p: Integer;
Cancel: Boolean;
begin
inherited GetAvailSize;
Cancel:=False;
Hex20:=0;
BytesRead:=1024;
Data.Seek(0,soFromBeginning);
p:=Trunc(Data.Size/1024);
Percent:=0;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
while (BytesRead=1024) and not(Cancel) do begin
BytesRead:=Data.Read(Buffer,1024);
for i:=0 to BytesRead-1 do begin
if ((Buffer[i]=$20) or (Buffer[i]=$0)) then Inc(Hex20);
end;
Percent:=Percent+p;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
GetAvailSize:=Hex20 div 8;
end;
function TASCIIReplace.CreateFromCarrierFile(cf: TCarrierFile): Boolean;
begin
if cf.GetFileType='ASC' then begin
Data.Clear;
cf.SaveToStream(Data);
SetFileType(cf.GetFileType,cf.GetColorDepth);
Percent:=cf.Percent;
CreateFromCarrierFile:=True;
end
else CreateFromCarrierFile:=False;
end;
function TASCIIReplace.ExportToCarrierFile(cf: TCarrierFile): Boolean;
begin
cf.LoadFromStream(Data);
cf.SetFileType('ASC',0);
ExportToCarrierFile:=True;
end;
function TASCIIReplace.EnoughSpaceToHide(n: Longint): Boolean;
begin
if n>GetAvailSize then EnoughSpaceToHide:=False
else EnoughSpaceToHide:=True;
end;
function TASCIIReplace.Encode(ToHide: TDataFile): Boolean;
var
newData: TMemoryStream;
Buffer: Array[0..1023] of Byte;
BytesRead: Integer;
HideStream: TMemoryStream;
HideBuffer: Array[0..1023] of Byte;
HideRead: Integer;
CPos: Integer;
i,j: Integer;
val: Byte;
p: Integer;
Cancel: Boolean;
begin
Cancel:=False;
if EnoughSpaceToHide(ToHide.GetSize) then begin
HideStream:=TMemoryStream.Create;
ToHide.SaveToStream(HideStream);
newData:=TMemoryStream.Create;
Data.Seek(0,soFromBeginning);
BytesRead:=Data.Read(Buffer,1024);
CPos:=0;
HideRead:=1024;
HideStream.Seek(0,soFromBeginning);
Percent:=0;
p:=Trunc(HideStream.Size/1024);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
while (HideRead=1024) and not(Cancel) do begin
HideRead:=HideStream.Read(HideBuffer,1024);
for i:=0 to HideRead-1 do begin
for j:=7 downto 0 do begin
if (HideBuffer[i] and (1 shl j))=$0 then val:=$0 else val:=$20;
while ((Buffer[CPos]<>$0) and (Buffer[CPos]<>$20)) do begin
if CPos<BytesRead-1 then Inc(CPos)
else begin
newData.Write(Buffer,BytesRead);
BytesRead:=Data.Read(Buffer,1024);
CPos:=0;
end;
end;
Buffer[CPos]:=val;
if CPos<BytesRead-1 then Inc(CPos)
else begin
newData.Write(Buffer,BytesRead);
BytesRead:=Data.Read(Buffer,1024);
CPos:=0;
end;
end;
end;
Percent:=Percent+p;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
end;
newData.Write(Buffer,BytesRead);
if Data.Size>Data.Position then newData.CopyFrom(Data,Data.Size-Data.Position);
Data.Free;
Data:=newData;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
end
else Encode:=False;
end;
function TASCIIReplace.Decode(ResultFile: TDataFile): Boolean;
var
S24: Array[0..2] of Byte;
Size: Integer;
outStrm: TMemoryStream;
DataBuffer: Array[0..1023] of Byte;
DataWritten: Integer;
CarrierBuffer: Array[0..1023] of Byte;
CarrierRead: Integer;
i,j: Integer;
d,c: Integer;
val: Integer;
Cancel: Boolean;
begin
Cancel:=False;
Percent:=0;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
// decode first 3 bits
Data.Seek(0,soFromBeginning);
i:=0;
d:=0;
c:=0;
CarrierRead:=Data.Read(CarrierBuffer,1024);
while i<3 do begin
val:=0;
for j:=7 downto 0 do begin
while ((CarrierBuffer[c]<>$0) and (CarrierBuffer[c]<>$20)) do begin
if ((c=CarrierRead) and (CarrierRead=1024)) then begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
end
else Inc(c);
end;
if CarrierBuffer[c]=$20 then val:=val+(1 shl j);
if c<CarrierRead-1 then Inc(c)
else begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
end;
end;
S24[d]:=val;
Inc(DataWritten);
Inc(d);
Inc(i);
end;
// then decode other data
Size:=S24[0]+(S24[1] Shl 8)+(S24[2] Shl 16);
outStrm:=TMemoryStream.Create;
DataWritten:=0;
i:=0;
d:=0;
while (i<Size) and not(Cancel) do begin
if (d=1024) then begin
outStrm.Write(DataBuffer,1024);
DataWritten:=0;
d:=0;
end;
val:=0;
for j:=7 downto 0 do begin
while ((CarrierBuffer[c]<>$0) and (CarrierBuffer[c]<>$20)) do begin
if ((c>CarrierRead-2) and (CarrierRead=1024)) then begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
end
else Inc(c);
end;
if CarrierBuffer[c]=$20 then val:=val+(1 shl j);
if c<CarrierRead-1 then Inc(c)
else begin
CarrierRead:=Data.Read(CarrierBuffer,1024);
c:=0;
end;
end;
if CarrierRead=0 then break;
Percent:=Trunc(i/Size);
if Assigned(FPercentChange) then FPercentChange(self,Percent);
if Assigned(FWantCancel) then FWantCancel(self,Cancel);
Application.ProcessMessages;
DataBuffer[d]:=val;
Inc(DataWritten);
Inc(d);
Inc(i);
end;
outStrm.Write(DataBuffer,DataWritten);
ResultFile.LoadFromStream(outStrm);
outStrm.Free;
Percent:=100;
if Assigned(FPercentChange) then FPercentChange(self,Percent);
Application.ProcessMessages;
Decode:=True;
end;
end.
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -