Kłopot z prawidłowym działaniem funkcji dekodującej tekst, przetłumaczonej z PHP

0

Cześć.

Jak wiecie zwykle radzę sobie sam. Ale nie jestem dobry nawet z lamerskiej 'xorowej enkrypcji" i coś pewnie poknociłem. Ponieważ taki kod z PHP:

function unmask($text) {
	$length = ord($text[1]) & 127;
	if($length == 126) {
		$masks = substr($text, 4, 4);
		$data = substr($text, 8);
	}
	elseif($length == 127) {
		$masks = substr($text, 10, 4);
		$data = substr($text, 14);
	}
	else {
		$masks = substr($text, 2, 4);
		$data = substr($text, 6);
	}
	$text = "";
	for ($i = 0; $i < strlen($data); ++$i) {
		$text .= $data[$i] ^ $masks[$i%4];
	}
	return $text;
}

Prxetłumaczyłem na Delphi jako:

function UnMask(const Text : string) : string;
var
  Length, I : integer;
  Masks, Data : string;
begin
  Length := Ord(Text[2]) and 127;
  if Length = 126 then
  begin
    Masks := Copy(Text, 5, 4);
    Data := Copy(Text, 9, MaxInt);
  end
  else
  begin
    if Length = 127 then
    begin
      Masks := Copy(Text, 11, 4);
      Data := Copy(Text, 15, MaxInt);
    end
    else
    begin
      Masks := Copy(Text, 3, 4);
      Data := Copy(Text, 7, MaxInt);
    end;
  end;
  Result := '';
  for I := 1 to System.Length(Data) do
  begin
    Result := Result + Chr(Ord(Data[I]) xor Ord(Masks[I mod 4]));
  end;
end;

Jednak plik test.aaa zamiast zdekodować mi tak jak PHP czyli:
{"message":"testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, testujemy, koniec","name":"olesio","color":"007AFF"}
Decoduje mi niewłaściwie, tak jak widzicie. Dołączyłem plik i przykładowy kod z exekiem w Delphi 7 do testów.

Pewnie rozwiązanie jest banalne, ale ze względu na wczesną porę i mało snu w nocy. Sam nie potrafię na nie wpaść. A próbuję po raz pierwszy w życiu zaznajomić się z WebSocketami i analizuje różne rzeczy. Korzystając z przykładowego kodu w PHP znalezionego w Google. Starając się docelowo później napisać w Delphi prosty klient prostego serwera chatu w PHP opartego na WebSocketach. Z góry dziękuję za wszelkie przykłady prawidłowego kodu.

3

Mały błąd:

  for I := 0 to System.Length(Data)-1 do //<-- tu -1
  begin
    Result := Result + Chr(Ord(Data[I+1]) xor Ord(Masks[I mod 4 + 1])); //<--tu +1
  end;

EDIT: @olesio zmodyfikowałem bo jeszcze jeden błąd z długością był

0

Dzięki to jest to. Tak myślałem, że z tym mam błąd, bo co 4 znak był niewłaściwy. A mój niematematyczny łeb kazał mi kombinować z pomocniczą zmienną zwiększąną w pętli i ustawianą znowu na 1 gdy jej wartość była większa od czterech.

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