?? datafile.pas
字號:
unit DataFile;
interface
uses Classes, SysUtils, BasicFile
{$IFDEF CLX}
, QDialogs
{$ELSE}
,Dialogs
{$ENDIF}
;
type
TDataFile = class(TBasicFile)
protected
public
procedure Prepend3CharExt(ext: String);
function Extract3CharExt: String;
procedure PrependSize(Size: Longint);
procedure Distribute(AvailSize: Longint);
procedure Undistribute(AvailSize: Longint);
function IsDistributed(AvailSize: Longint): Boolean;
end;
implementation
procedure TDataFile.Prepend3CharExt(ext: String);
var
newData: TMemoryStream;
Ext3: Array[0..2] of Byte;
i: Byte;
begin
newData:=TMemoryStream.Create;
for i:=0 to 2 do Ext3[i]:=Ord(ext[i+1]);
newData.Write(Ext3,3);
Data.Seek(0,soFromBeginning);
newData.CopyFrom(Data,Data.Size);
Data.Free;
Data:=newData;
end;
function TDataFile.Extract3CharExt: String;
var
newData: TMemoryStream;
Ext3: Array[0..2] of Byte;
ext: String;
i: Byte;
begin
newData:=TMemoryStream.Create;
Data.Seek(0,soFromBeginning);
Data.Read(Ext3,3);
Data.Seek(3,soFromBeginning);
newData.CopyFrom(Data,Data.Size-3);
Data.Free;
Data:=newData;
ext:='';
for i:=0 to 2 do ext:=ext+Chr(Ext3[i]);
Extract3CharExt:=ext;
end;
procedure TDataFile.PrependSize(Size: Longint);
var
newData: TMemoryStream;
S24: Array[0..2] of Byte;
begin
newData:=TMemoryStream.Create;
S24[0]:=Size and $0000FF;
S24[1]:=(Size and $00FF00) shr 8;
S24[2]:=(Size and $FF0000) shr 16;
Size:=S24[0]+(S24[1] Shl 8)+(S24[2] Shl 16);
newData.Write(S24,3);
Data.Seek(0,soFromBeginning);
newData.CopyFrom(Data,Data.Size);
Data.Free;
Data:=newData;
end;
procedure TDataFile.Distribute(AvailSize: Longint);
var
newData: TMemoryStream;
rand: Byte;
buffer: Array[0..1023] of byte;
dbuffer: Array[0..16383] of byte;
dread: Integer;
spacing: Real;
error: Real;
db_idx: Integer;
i: Integer;
j: Byte;
int_space: Integer;
size: Longint;
size2: Longint;
begin
size:=Data.Size;
Data.Seek(0,soFromBeginning);
spacing:=(AvailSize/(Data.Size+5))-1;
//if spacing>15 then spacing:=15;
if (spacing>0) then begin
newData:=TMemoryStream.Create;
error:=0;
dread:=1024;
Randomize;
while (dread=1024) do begin
dread:=Data.Read(buffer,1024);
db_idx:=0;
for i:=0 to dread-1 do begin
dbuffer[db_idx]:=buffer[i];
Inc(db_idx);
error:=error+spacing;
if error>=1 then begin
int_space:=Trunc(error);
for j:=1 to int_space do begin
dbuffer[db_idx]:=Random(256);
Inc(db_idx);
error:=error-1;
end;
end;
end;
newData.Write(dbuffer,db_idx);
end;
Data.Free;
Data:=newData;
PrependSize(size);
end;
size2:=Data.Size;
PrependSize(size2);
end;
procedure TDataFile.Undistribute(AvailSize: Longint);
var
newData: TMemoryStream;
rand: Byte;
buffer: Array[0..1023] of byte;
dbuffer: Array[0..1023] of byte;
dread: Integer;
spacing: Real;
error: Real;
db_idx: Integer;
i: Integer;
j: Byte;
int_space: Integer;
size: Longint;
begin
// get real size
Data.Seek(0,soFromBeginning);
Data.Read(buffer,3);
size:=(buffer[2] shl 16)+(buffer[1] shl 8)+buffer[0];
spacing:=(AvailSize/(size+5))-1;
//if spacing>15 then spacing:=15;
if spacing>0 then begin
newData:=TMemoryStream.Create;
error:=0;
dread:=1024;
Randomize;
while (dread=1024) do begin
dread:=Data.Read(buffer,1024);
db_idx:=0;
i:=0;
for i:=0 to dread-1 do begin
//ShowMessage(Chr(buffer[i])+' error: '+floattostr(error));
if (error<1) then begin
dbuffer[db_idx]:=buffer[i];
Inc(db_idx);
error:=error+spacing;
//ShowMessage('selected character:' + Chr(buffer[i]));
end
else error:=error-1;
end;
newData.Write(dbuffer,db_idx);
end;
Data.Free;
Data:=newData;
end;
end;
function TDataFile.IsDistributed(AvailSize: Longint): Boolean;
var
buffer: Array[0..3] Of Byte;
size: Longint;
fullsize: Longint;
dist: Boolean;
spacing: Real;
begin
dist:=false;
fullsize:=Data.Size;
Data.Seek(0,soFromBeginning);
Data.Read(buffer,3);
size:=(buffer[2] shl 16)+(buffer[1] shl 8)+buffer[0]+5;
if size<fullsize then begin
spacing:=(AvailSize/(size+5))-1;
//if spacing>15 then spacing:=15;
if spacing<=0 then dist:=false
else begin
spacing:=spacing+1;
if spacing*size>fullsize-3 then dist:=true;
end;
end;
//if dist then ShowMessage('think its distributed') else ShowMessage('don`t think it`s distributed');
IsDistributed:=dist;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -