Avoir une explication sur uen portion de code

Signaler
Messages postés
4
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
25 janvier 2009
-
Messages postés
4
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
25 janvier 2009
-
Bonsoir, je désirerais avoir une explication assez détaillée pour la portion de code en rouge  Merci:

function TForm1.DecodeMSKey(const HexSrc: array of byte): string;
const  StartOffset: integer $34;      // Offset 34 Array[52]  EndOffset:   integer $34 + 15; // Offset 34 + 15(Bytes) Array[64]
  Digits: array[0..23] of char =
    ('B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R', 'T',
    'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9');
  DecodedLen: integer = 29;       // Length of Decoded Product Key
  EncodedLen: integer = 15;
  // Length of Encoded Product Key in Bytes (An total of 30 in chars)
var
  HexDigitalPID: array of cardinal;
  Des:   array[0..30] of char; // Length of Decoded Product Key + 1
  I:     integer;
  N:     integer;
  HN:    cardinal;
  Value: cardinal;
begin
  Result := '';
  SetLength(HexDigitalPID, DecodedLen);
  for I := StartOffset to EndOffset do
    HexDigitalPID[I - StartOffSet] := HexSrc[I];


  // SetLength(Des, DecodedLen + 1);


  for I := DecodedLen - 1 downto 0 do
    if (((I + 1) mod 6) = 0) then
      Des[I] := '-'
    else
    begin
      HN := 0;
      for N := EncodedLen - 1 downto 0 do
      begin
        Value := (HN shl 8) or HexDigitalPID[N];
        HexDigitalPID[N] := Value div 24;
        HN    := Value mod 24;
      end;
      Des[I] := Digits[HN];
    end;
  Des[DecodedLen] := Chr(0);


  //  For I := 0 To Length(Des) Do
  //    begin
  //     Result := Result + Des[I];
  //    end;
  Result := StrPas(Des);
end;

3 réponses

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
function DecodeMSKey(const HexSrc: array of byte): string;
const
  StartOffset = $34;              // Offset 0x34        (52)
  EndOffset   = StartOffset + 15; // Offset 0x34 + 0x0F (67)
  DecodedLen  = 29;               // Length of Decoded Product Key
  EncodedLen  = 15;               // Length of Encoded Product Key in Bytes (An total of 30 in chars)
  Digits      : array[0..23] of char ='BCDFGHJKMPQRTVWXY2346789';
var
  HexDigitalPID : array[0..EncodedLen] of cardinal;
  pRes          : PChar; // Length of Decoded Product Key + 1
  I, N          : integer;
  HN, Value     : cardinal;
begin
  SetLength(Result, DecodedLen);
  pRes := PChar(Result);
  { result := '                             ';
  }
 
  for I := StartOffset to EndOffset do            
    HexDigitalPID[I-StartOffSet] := HexSrc[I];  { I 52 to 67 15 iterations
    Hardcoded :
     HexDigitalPID[0]  := HexSrc[StartOffset+0]
     HexDigitalPID[1]  := HexSrc[StartOffset+1]
     HexDigitalPID[2]  := HexSrc[StartOffset+2]
     HexDigitalPID[3]  := HexSrc[StartOffset+3]
     HexDigitalPID[4]  := HexSrc[StartOffset+4]
     HexDigitalPID[5]  := HexSrc[StartOffset+5]
     HexDigitalPID[6]  := HexSrc[StartOffset+6]
     HexDigitalPID[7]  := HexSrc[StartOffset+7]
     HexDigitalPID[8]  := HexSrc[StartOffset+8]
     HexDigitalPID[9]  := HexSrc[StartOffset+9]
     HexDigitalPID[10] := HexSrc[StartOffset+10]
     HexDigitalPID[11] := HexSrc[StartOffset+11]
     HexDigitalPID[12] := HexSrc[StartOffset+12]
     HexDigitalPID[13] := HexSrc[StartOffset+13]
     HexDigitalPID[14] := HexSrc[StartOffset+14]
  }
      { I :28 downto 0 29 iterations
  }
  for I := DecodedLen-1 downto 0 do
  begin
    case I of
      23, 17, 11, 5 : pRes[I] := '-';
                     { result = '     -     -     -     -     '
                     }
      else
      begin
        HN := 0;
        for N := EncodedLen-1 downto 0 do
        begin
          Value            := (HN shl 8) or HexDigitalPID[N];
          HexDigitalPID[N] := Value div 24;
          HN               := Value mod 24;
          { pour cas HexDigitalPid[N] = 1
            N= 14; Value= 1;    HexDigitalPID[14]= 0;   HN= 1
            N= 13; Value= 257;  HexDigitalPID[13]= 10;  HN= 17
            N= 12; Value= 4353; HexDigitalPID[12]= 181; HN= 9
            N= 11; Value= 2305; HexDigitalPID[11]= 96;  HN= 1
            N= 10; Value= 257;  HexDigitalPID[10]= 10;  HN= 17
            N= 9;  Value= 4353; HexDigitalPID[9]= 181;  HN= 9
            N= 8;  Value= 2305; HexDigitalPID[8]= 96;   HN= 1
            N= 7;  Value= 257;  HexDigitalPID[7]= 10;   HN= 17
            N= 6;  Value= 4353; HexDigitalPID[6]= 181;  HN= 9
            N= 5;  Value= 2305; HexDigitalPID[5]= 96;   HN= 1
            N= 4;  Value= 257;  HexDigitalPID[4]= 10;   HN= 17
            N= 3;  Value= 4353; HexDigitalPID[3]= 181;  HN= 9
            N= 2;  Value= 2305; HexDigitalPID[2]= 96;   HN= 1
            N= 1;  Value= 257;  HexDigitalPID[1]= 10;   HN= 17
            N= 0;  Value= 4353; HexDigitalPID[0]= 181;  HN= 9
          }
        end;
        pRes[I] := Digits[HN];
        { result = 'PPPPP-PPPPP-PPPPP-PPPPP-PPPPP'
        }
      end;
    end;
    inc(pRes);
  end;
end;




<hr size="2" width="100%" />
Messages postés
4
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
25 janvier 2009

Merci beaucoup pour cette décortication du code je vais le regarder à tête reposée c'est génial. merci encore
Messages postés
4
Date d'inscription
mardi 29 avril 2003
Statut
Membre
Dernière intervention
25 janvier 2009

Bonsoir, j'ai bien regardé votre explication et je ne comprends pas tres biens comment se calcule le Value := (HN shl 8) or HexDigitalPID[N]; en effet comment  calculerait-on avec une HexDigitalPID = 01 CC 06 C7 A0 5D 84 2A 87 C1 EB CC 75 04 80, valeurs hexadécimale ? Merci