[pascal] algorytm XOR - błąd

0

pisze program który koduje tekst z pliku txt do pliku dat i potem rozkodowuje tekst z pliku dat do pliku txt:

var
  key : String;

procedure Code;
var
  pfileIn, pfileOut : Text;
  Result, C : Char;
  passingCounter : Integer;
begin
  Assign(pfileIn, 'TEKST.TXT');
  Reset(pfileIn);
  Assign(pfileOut, 'KOD.DAT');
  Rewrite(pfileOut);
  passingCounter:=0;
  while not eof(pfileIn) do
  begin
    Read(pfileIn, c);
    Result:=Chr(Ord(Key[passingCounter]) xor Ord(c));
    Write(pfileOut, Result);
    inc(passingCounter);
    if passingCounter > length(key) then
      passingCounter:=0;
  end;
  Close(pfileIn);
  Close(pfileOut);
end;

// i procka rozkodowująca

procedure Decode;
var
  pfileIn, pfileOut : Text;
  Result, C : Char;
  passingCounter : Integer;
begin
  Assign(pfileIn, 'KOD.DAT');
  Reset(pfileIn);
  Assign(pfileOut, 'WYNIK.TXT');
  Rewrite(pfileOut);
  passingCounter:=0;
  while not eof(pfileIn) do
  begin
    Read(pfileIn, c);
    Result:=Chr(Ord(Key[passingCounter]) xor Ord(c));
    Write(pfileOut, Result);
    inc(passingCounter);
    if passingCounter > length(key) then
      passingCounter:=0;
  end;

  Close(pfileIn);
  Close(pfileOut);
end;

Klucz jest standardowo wczytywany z klawiatury. Problem tkwi w tym, że
po rozkodowaniu nie otrzymuje całego tekstu wejściowego tylko jego fragment.
Siedze już troche i nie moge wykminić czemu sie tak dzieje.

Może ktoś mógłby rzucić okiem?

0

widać któryś z bajtów po xorowaniu daje znaczek 27, który to oznacza koniec pliku tekstowego. rozwiązanie - zrezygnuj z plików tekstowych, rób na amorficznych poprzez blockread/blockwrite.

0

A nie da się tego problemu jakoś inaczej rozwiązać? Stosowanie plików tekstowych jest niestety WYMAGANIEM:|

0

to może każdy char przed wpisaniem zamieniać na dwa bajty szesnastkowe - czyli tekstowe 0-F, wtedy by nie było wyjściowo pliku binarnego tylko zwykły tekstowy, a przy odczytywaniu brać pod uwagę dwa bajty i zamieniać z powrotem na char

a w jakim sensie musi to być na plikach tekstowych, bo blockread/write to dalej będą pliki tekstowe tylko obsługa inna, może przytoczysz zdanie z zadania ? :)

0

Program ma kodować tekst z pliku TEKST.TXT zakodować go do pliku KOD.DAT i potem rozkodować do pliku WYNIK.TXT. Tak to wygląda

0

W zadaniu nie ma napisane, że musi być plik tekstowy ;P Jest tylko napisane, jakie mają nazwy i rozszerzenia ;P

0

sprawdziłem i fucktycznie się zatrzymuje na znaczku ucieczki #27

po pierwsze nie <ort>pisze </ort>że to musi być fajny xor więc możesz dać metodę szyfrowania której wynik nie będzie binarny

po drugie nie wiem czy wiesz ale znak z kod "Key" ustawiasz wyjściowo na 0 - a ten index zawiera długość stringu zawartego w tej zmiennej, czyli np plik naprawdę nie jest zakodowany hasłem 'Adamo' tylko #5'Adamo'

po trzecie możesz po zakodowaniu, Result sprawdzać czy jest równy 27 i jeśli tak to odxorować ją i niektóre znaczki po prostu by zostały odkodowane a przy odczycie ta sama reguła

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