Выкладываю алгоритм генерации СИКа. Выдрал из библиотеки tsric321.dll еще 3 года назад. Пивом никто ставить не хочет, ну и ладно.
Исходники для Delphi 7.
Сам юнит генерации и проверки СИКа.
unit sik;
interface
procedure MyTestData(sData: string; var Ric: string);
procedure MyTestRic(var Ric: string);
implementation
uses SysUtils, Dialogs;
const
T2: array [0..127] of byte =
($06,$0C,$08,$04,$0F,$01,$09,$02,$0A,$0E,$05,$07,$00,$0B,$03,$0D,
$05,$0F,$04,$0D,$00,$07,$0A,$03,$0E,$0C,$01,$02,$08,$06,$0B,$09,
$0A,$08,$01,$0E,$0B,$02,$03,$00,$0F,$06,$04,$09,$07,$0C,$05,$0D,
$07,$0F,$0A,$0B,$03,$01,$0D,$08,$04,$05,$0C,$09,$00,$0E,$02,$06,
$03,$0C,$07,$0E,$0D,$01,$05,$0F,$09,$04,$08,$02,$0B,$00,$06,$0A,
$09,$0E,$0B,$02,$0D,$00,$0C,$0F,$01,$06,$08,$04,$03,$0A,$07,$05,
$0C,$03,$06,$09,$05,$08,$0A,$02,$00,$0D,$0F,$07,$01,$0E,$0B,$04,
$0F,$09,$07,$08,$01,$0E,$04,$06,$0B,$00,$0C,$02,$0D,$03,$0A,$05);
CharValue = '0123456789ABCDEFGHJKMNPRSTUVWXYZ';
var
T1: array[0..31] of byte;
Data: array[0..127] of byte;
WorkByte: array[0..7] of byte;
Kd8: integer;
M1: array[0..63] of byte;
function ConvertValue1(Value: longword): longword;
var
Bv: array [0..7] of byte;
I: integer;
Tv: longword;
Tb: byte;
begin
Tv := Value;
for I := 0 to 3 do
begin
Bv[0+(I*2)] := Tv and $0F;
Bv[1+(I*2)] := (Tv and $F0) shr 4;
Tv := Tv shr 8;
end;
for I := 0 to 7 do
begin
Tb := Bv[I];
Bv[I] := T2[Tb + (I * 16)];
end;
Tv := 0;
for I := 3 downto 0 do
begin
Tv := Tv shl 8;
Tv := Tv or Bv[0+(I*2)];
Tv := Tv or (Bv[1+(I*2)] shl 4);
end;
Result := Tv;
end;
function ConvertValue2(Value: longword): longword;
var
I: word;
Tv: longword;
begin
Tv := Value;
for I := 0 to 10 do
begin
if (Tv and $80000000) = 0 then
Tv := Tv + Tv
else
begin
Tv := Tv + Tv;
Tv := Tv or 1;
end;
end;
Result := Tv;
end;
Продолжение далее...