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

📄 datafile.pas

📁 wbs43open-src.zip 数字隐藏工具
💻 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 + -