5,928
社区成员




procedure DecodeProductKey(const HexSrc: array of BYTE; Des: PChar); stdcall;
const
StartOffset: INTEGER = $34;
EndOffset: INTEGER = $34 + 15;
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');
dLen: INTEGER = 29;
sLen: INTEGER = 15;
var
HexDigitalPID: array of CARDINAL;
I, N: INTEGER;
HN, Value: CARDINAL;
begin
SetLength(HexDigitalPID, dLen);
for I := StartOffset to EndOffset do
begin
HexDigitalPID[I - StartOffSet] := HexSrc[I];
end;
for I := dLen - 1 downto 0 do
begin
if (((I + 1) mod 6) = 0) then
begin
Des[I] := '-';
end
else begin
HN := 0;
for N := sLen - 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;
end;
Des[dLen] := #0;
end;
var
S: String;
......
begin
SetLength(S, 30);
DecodeProductKey(..., PChar(S));
end;