Zapis pliku za pomocą strumienia, własny format pliku

0

Chce zapisać jakiś dowolny plik do nowego pliku w postaci częściowo zakodowanej, spłodziłem kod nastepujacy:

function ROT13( teksty: string) : string;
Begin
//...
  result := teksty;
end;

procedure Zapisz();
var
  plik_open, plik_save: TFileStream;
  Buffer : array[0..1000024] of char;
  tmp: string;
  i: integer;
Begin
  plik_open := TFileStream.Create('przyklad.jpg', fmOpenReadWrite);
  Plik_open.Position := 0;
  Plik_open.ReadBuffer( Buffer, plik_open.Size );

// tu szyfruje sobie fragment pliku, btw jak to zrobic bardziej elegancko, 
// bo do funkcji ROT13 potzrebuje przekazac stringa i odbieram tez stringa
  for i:=1 to 100000 do
     tmp := tmp + Buffer[i];
  
  tmp:= ROT13(tmp);
  for i:=1 to 100000 do
     Buffer[i] := tmp[i];

  plik_save := TFileStream.Create( 'moj_plik', fmcREATE);
  plik_save.Seek(plik_save.Size, soFromBeginning);
  plik_save.WriteBuffer(Buffer, plik_open.Size);

  plik_open.Free;
  plik_save.Free;
End;

Duzych plikow nie moge zapisac gdyz rozmiar tablicy buffer jest tablica statyczna, probowalem deklarowac dynamicznie (fragment ponizej), ale coś jest nie tak, jak zrobic by zapisalo kazdy plik i czy

var
  Buffer : array of char;
....
  plik_open := TFileStream.Create('przyklad.jpg', fmOpenReadWrite);
  Plik_open.Position := 0;
  setlength(buffer, plik_open.Size);
  Plik_open.ReadBuffer( Buffer, plik_open.Size );
0

Spróbuj tak:

var
  fs, fd: TFileStream;
  size: Int64;
  i: Integer;
  Buffer: PChar;
  a: Byte;
begin
  fs:= TFileStream.Create('C:\a.gif', fmOpenRead);
  size:= fs.Size;
  fs.Position:= 0;
  Buffer:= AllocMem(size);
  fs.Read(Buffer^, size);
  fs.Free;

  //tu jaies np szyfrowanie xor
  for i:=0 to size - 1 do
  begin
    a:= Byte(Buffer^);
    Byte(Buffer^) := $FF xor a;
    Inc(Buffer);
  end;
  Dec(Buffer, size);

  //a tu deszyfrowanie
  for i:=0 to size - 1 do
  begin
    a:= Byte(Buffer^);
    Byte(Buffer^):= a xor $FF;
    Inc(Buffer);
  end;
  Dec(Buffer, size);

  fd:= TFileStream.Create('C:\b.gif', fmCreate);
  fd.Write(Buffer^, size);
  fd.Free;

  FreeMem(Buffer, size);
end;

I jeszcze jedno NIGDY w żaden sposób nic nie kopiuj do zmiennych typu string przy danych binarnych, bo dane zostanę urwane na pierwszym znaku o kodzie $00.

0

Dzięki kAzek, sporo mnie nauczył Twój kod [soczek]

Pozdrawiam i jeszcze raz dziękuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1