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

Odpowiedz Nowy wątek
2015-12-26 08:56
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.

  • test.rar (0,03 MB) - ściągnięć: 23

edytowany 1x, ostatnio: olesio, 2015-12-26 08:59

Pozostało 580 znaków

2015-12-26 09:17

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ł


Nie odpowiadam na PW w sprawie pomocy programistycznej.
Pytania zadawaj na forum, bo:
od tego ono jest ;) | celowo nie zawracasz gitary | przeczyta to więcej osób a więc większe szanse że ktoś pomoże.
edytowany 3x, ostatnio: kAzek, 2015-12-26 09:27
@kAzek, Data to string z numeracją od 1. Chyba jesteś nijaki po wczorajszym? Nie to jednak ja nijaki :/ - _13th_Dragon 2015-12-26 11:10
No i co z tego że od 1? 0 +1 = 1 chyba? - kAzek 2015-12-26 11:11

Pozostało 580 znaków

2015-12-26 11:15
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.


Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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