PDA

Просмотр полной версии : Как вычисляеться контрольная цифра?



Петрович
01.04.2007, 02:54
Собственно предисловие - мне эти контрольные цифры в отчетах всю жизь портят -
каждую симку приходиться записывать в ручную,
хотя отличия только в порядковых номерах+ эта самая последняя цифра
ICCID:893750105070981377 :confused: 2:confused:
для примера у Велкома
18-ть первых цифр - порядковый номер, а 19-я чек-сумма (и не порядковая соответственно)
В поиск и гуглю не слать -
там только общие принципы для штрих-кодов нашел да для всяких страховых карточек - на симки ничего :kulak:

Петрович
04.04.2007, 22:32
досадно, что никто не может помочь :kulak: , хотя если заголовки ветки почитать,
то мы умеем всё :rules: :
- прослушка gsm номера имея его же клона
- Скопировать контакты без пин кода
- сделать чтобы видеть закрытые номера
- SIM заблокирована совсем, и все-таки прочесть контакты, если найду пин.
....
и даже алгоритм аутентификации абонента в сети говорят читали :rules: ,
....
а вот как считаеться эта несчастная циферка в ICCID никто и не знает:confused: ,
или не говорит :zha:
чур не :pomidor: - это эмоции :visit:,
уж очень достало ручками каждую симку вписывать.
особенно , когда их в день проходит по 130 шт.

Петрович
13.04.2007, 13:10
Ладно,
вот что удалось установить, вспомнив курс математики ВУЗа :rules: :
нечетные позиции - вычитаются от "14"
четные - умнажаються на "8"
всё это дело складываеться - и береться число "единиц" -
ЭТО И БУДЕТ КОНТРОЛЬНАЯ ЦИФРА

Пример:
893750107010339856-8

__1____2_____3____4__.....__16____17___18
(14-8)+9*8+(14-3)+7*8+.....+8*8+(14-5)+6*8=
=6+72+11+56+9+0+13+0+7+0+13+0+11+24+5+64+9+48=348
= КОНТРОЛЬНАЯ - "ЦИСЛО ЕДИНИЦ" - "8"

вот только попадание на некоторых массивах "+/- 1"
и причем ДАЛЬШЕ ЧЕМ НА ЕДИНИЦУ НЕ УХОДИТ.
если кто сможет более детально помочь - могу выслать массивы
для анализа и обработки.
номеров симок.

TANKeX3m
23.04.2007, 09:05
Да калькулятор из тебя ваще крутой))) и кстать скидал по твоему алгоритму симку заряботала))))

TANKeX3m
24.05.2007, 18:47
Посчитал немного и пришел к такому ответу

icc код полностью рачитывать не стал, но контрольной цифры там на сколько я понял нету он считается следующим образом

предпоследняя цифра и все перед ней с каждым следующим номером идет по поррядку

допустим icc код в tele2
89701201200018095414
следующий будет
89701201200018095422

далее довольно легко считается последняя это очень просто

89701201200018095414
Следующяя будет
89701201200018095422
опять же всё очень просто
к последней цифре добавляем 8 и получаем следующую, есть один нюанс из прибавленного считаются только единицы, а продесятки забываем их просто отбрасывают, вот тока иногда смещение идет его принцип я так и не понял если не верите копирую вам несколько реальных номеров по порядку (Я ваду реестры подключений по операторам и у меня номера и владельцы, подключавшиеся в нашей фирме тысячами лежат в эксэлевских доках)

89701201200018181263
89701201200018181271
89701201200018181289
89701201200018181297
89701201200018181305
89701201200018181313
89701201200018181321
89701201200018181339
89701201200018181347
89701201200018181354
89701201200018181362
89701201200018181370
89701201200018181388
89701201200018181396
89701201200018181404
89701201200018181412
89701201200018181420
89701201200018181438
89701201200018181446
89701201200018181453
89701201200018181461

TANKeX3m
24.05.2007, 18:54
Еще одно если кто захочет разобрать порядок смещения выкладываю полностью таблицу с номерами 50 номеров подрят

77
24.05.2007, 19:31
контрольной цифры там на сколько я понял нету он считается следующим образом

Да что за бред тут?
По LUHN-Check она считается.

TANKeX3m
25.05.2007, 12:24
Это не бред, это полученные на практике результаты

Петрович
26.05.2007, 04:21
Огромное спасибо "77"-му за оказанную помощь!!! :yoyo:
да действительно алгоритм есть
Применительно к карточкам для 19 знаков (BY VELCOM)
прилагаю Excel-вский файлик
В первую ячейку вводим номер сим-карты
в соседней получаем контрольную сумму
(номер можно вводить вместе с контрольной, а можно и без).

Петрович
26.05.2007, 04:28
Если когото заинтересует также как и меня сама процедура вычисления,
то с разрешения "77" я выкладываю процедуру расчета на Паскале,
по которой можно проследить посследовательность расчетов

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 на последнюю цифру, если передаёшь с контроьной..

И ещё есть по IMEI аналогичная процедура

Function IMEICheck(S : String) : Byte;
Begin
Summ:=0;
For i:= 1 to 14{Length(S){-1} do
Begin
Val(S[i],CODE[i],errc);
if not odd(i) then
Begin
Inc(CODE[i],CODE[i]);
if CODE[i]>9 then Dec(CODE[i],9);
end;
Inc(Summ,CODE[i]);
end;
if (Summ mod 10) = 0 then i:=0 else i:=10;
IMEICheck:=i-(Summ mod 10);
end;

Петрович
26.05.2007, 04:29
а эт ещё нашел с пояснениями все того же 77-го

For iLch:= 1 to DL do {в цикле, по порядку с первой до последней цифры ICCID над каждой выполняем:}
Begin

if ODD(iLch) then {если это по счёту (по порядку) нечётная позиция ICCID, то:}
Begin
Inc(CODE[iLch],CODE[iLch]); {удваиваем её (умножаем на два)}
if CODE[iLch]>9 then Dec(CODE[iLch],9); {затем если она БОЛЬШЕ девяти, то отнимаем от неё 9}
end;
inc(Summ,CODE[iLch]); {теперь, неважно, какая она была, чётная или нечётная по счёту, добавляем её к заранее, до всего цикла обнулённой некоей переменной}
end;
{теперь, когда прошлись таким образом, по всем цифрам ICCID и получили некое Summ:}
if (Summ mod 10) = 0 then iLch:=0 else iLch:=10; {}
LUHNCheck:=iLch-(Summ mod 10); {контрольная цифра будет являться остатком от деления на десять}

Собственно, всё (-:

-
77 (21:17:12 4/05/2007)
Вот тут нюанс:
if (Summ mod 10) = 0 then iLch:=0 else iLch:=10; {если Summ делится на 10 без остатка, то некоей переменной (просто я iLch использую два раза - она более там не нужна) писваиваем 0, а если делится с остатком, то присваиваем ей 10. Нахрена - не помню, но писал это я сам. Так что сейчас буду напрягаться, чтобы вспомнить, нахрена это всё именно так}
LUHNCheck:=iLch-(Summ mod 10); {контрольная цифра будет являться разницой от iLch и остатком от деления Summ на десять}

:hello:

to TANKeX3m - ты не прав!

Петрович
26.05.2007, 04:32
и на закуску - выдержки из стандарта
по вычислению контрольной суммы
:kulak:
02. How do I determine if I have a valid credit card number?

Credit cards use the Luhn Check Digit Algorithm. The main purpose of
this algorithm is to catch data entry errors, but it does double duty
here as a weak security tool.

For a card with an even number of digits, double every odd numbered
digit and subtract 9 if the product is greater than 9. Add up all the
even digits as well as the doubled-odd digits, and the result must be
a multiple of 10 or it's not a valid card. If the card has an odd
number of digits, perform the same addition doubling the even numbered
digits instead.