Расчет последней (контрольной) цифры ICC у симкарт
Расчитывается по LUHN-Check приер на Паскале: Var Summ, Check : Byte; CODE : Array [1..20] of Integer;
i, Errc : Integer;
Function LUHNCheck(S : String) : Byte; Var Summ, DL : Byte; CODE : Array [1..20] of Integer; iLch : Integer; Begin Summ:=0; if Length(S) = 20 then DL:=Length(S)-1 else DL:=Length(S); For iLch:= 1 to DL do Begin Val(S[iLch],CODE[iLch],Errc); if ODD(iLch) then Begin Inc(CODE[iLch],CODE[iLch]); if CODE[iLch]>9 then Dec(CODE[iLch],9); end; inc(Summ,CODE[iLch]); end; if (Summ mod 10) = 0 then iLch:=0 else iLch:=10; LUHNCheck:=iLch-(Summ mod 10); end;
Там строчка if Length(S) = 20 then DL:=Length(S)-1 else DL:=Length(S); для уменьшения IICCID на последнюю цифру, если передаёшь с контроьной..
Не вдаваясь в методику расчета вот сылочка на Расчет контрольной цифры ICC онлайн. Проверял на симкартах МТС и Теле2 (19цифр, 20-я контрольная)