Страница 1 из 1
Как зделать проверку кода
Добавлено: Ср сен 21, 2011 19:02:59
Transistor
эсть кодовой замок (ево делаю я). Он зделаний на сдвиговом регистре, код считывается по 2 проводникам. Никак не могу организовать сравнение введенного кода (код накапливается а затем сравнивается с записанным).
Суть в том что чтобы ввести код необходимо его преобразовать в символы а затем используя операции strcpy склеивать символы в кучу. Как сделать проще?
Код: Выделить всё
while (1)
{
if (!input(PIN_A3))
ring (1);// звінок
else
{
if (!input(PIN_A4))
open ();// кнопка дверей
else
{
pass=keybord();//клавіатура
if (pass!=0)
{
itoa (pass,10,key);
for (i=1;i<=5;++i)
{
itoa (keybord(),10,key1);
strcpy(key,key1);
delay_us(5);
}
if (key=="12345")
open ();
}
open ();
}
}
}
Re: Как зделать проверку кода
Добавлено: Ср сен 21, 2011 22:05:46
Dr. Alex
А ты попробуй в процессе набора проверять каждую введённую цифру/букву. А исходный код записать как одномерный массив с колличеством элементов равным длинне кода.
Re: Как зделать проверку кода
Добавлено: Ср сен 21, 2011 22:08:29
rjhaviy
Для опроса клавы можно сделать таймер секунд на 10 и буфер (строку) на 5 байт, а также счетчик длины кода.
Таймер нужен для того, что если ничего не нажимали втечении 10 с, то вводимый код обнуляется
Счетчик длины кода, чтобы проверять код с эталонным, только тогда, когда введены все 5 символов
Если Счетчик длины кода = 5, то
{
проверяем код
}
иначе
{
Если Таймер >0, то
{
уменьшаем Таймер
}
иначе
{
обнуляем буфер и Счетчик длины кода
}
Если нажали на клавишу, то записываем ее код в буфер, счетчик длины кода ++, записываем в Таймер 10сек. Надеюсь ничего не напутал.
Извиняюсь что не в нормальном коде, последний раз программировал лет 10 назад.
Re: Как зделать проверку кода
Добавлено: Ср сен 21, 2011 22:50:01
Transistor
Масив виглядит очен привлекательно по простоте реализации просто создать два масива и проверять их в цикле (ето будеть запасной вариант).
А как бить из буфером? нужно введение символи слепить вместе но как зделать по легче без преобразования в символною строку спомощу етой функции itoa() (внутриная библиотека ССS). Може просто работать без преобразования в строку.
П.С. Прошу кусок кода из буфером.
Re: Как зделать проверку кода
Добавлено: Чт сен 22, 2011 01:07:51
rjhaviy
Это я массив буфером назвал
Код: Выделить всё
const int passSize = 5; //размер пароля 5
int passIndex = 0; //номер символа (байта) в массиве
char buffer[passSize];
char etalon[passSize]="12345";
Пароль (код) содержит только цифры? Тогда:
ASCII Коды символов 0,1,2,3,4,5: 48, 49, 50, 51, 52, 53 улавливаете?
Надо просто к полученному числу прибавить 48!
Но есть одно но - явного преобразования типа нет! Но его можно преобразовать в процессе.
Код: Выделить всё
if (passIndex<passSize)//если номер символа (байта) в массиве меньше размера пароля
{
//то читаем символ в массив
buffer[passIndex]=(char) (keyboard()+48);// кажется так тип преобразовывается
passIndex++; переходим к следующему байту
}
//иначе
else
{
passIndex=0; сбрасываем номер символа в массиве
CheckPass(); проверяем пароль с эталоном, ....код не привожу, спать хочу!
}
Вот как-то так.... Надеюсь нигде не напуделял. Я еще тот старый хакер

кстати если написать свою функцию проверки, можно пароль хранить не в символьном, а в int формате, тогда преобразовывать не надо.
Код: Выделить всё
int buffer[passSize] = 1,2,3,4,5;// не помню, можно так инициализировать????????
Re: Как зделать проверку кода
Добавлено: Чт сен 22, 2011 01:17:39
rjhaviy
Забыл написать, что в приведенном вами коде не все гладко. В подробности вдаваться некогда, если сможете
нарисуйте алгоритм работы вашего кодового замка, ну или исходник киньте.
Re: Как зделать проверку кода
Добавлено: Чт сен 22, 2011 07:55:33
Аlex
ИМХО, проверку кода нужно делать после каждой нажатой кнопки. Как только нажали неверно - сброс. И для этого вовсе не нужно его укладывать в буфер для сравнения. Тем более в ASCII.
Re: Как зделать проверку кода
Добавлено: Чт сен 22, 2011 18:42:57
Transistor
Проверк после каждова символа делать нехарашо как мне кажетса потаму что можна так подобрать соответствующий сивол так как цифер восем нужно перебрать 7 вариантов. Даже длину пароля можна не учитовать перебором можна сломать. Да с кодом не все гладко но по чуть четь виглажу
Re: Как зделать проверку кода
Добавлено: Чт сен 22, 2011 18:53:06
Аlex
Transistor писал(а):так как чифер восем все во нужно перебрать 7 вариантов.
Вы шутите ?

Посмотрел бы я на Вас как Вы подберёте 8-ми значный код за 7 вариантов, учитывая то, что при неправильном нажатии набор будет сбрасываться, и вы об этом знать не будете. Даже если клавиатура будет из 8-ми цифр, Вы будете подбирать вечно....
Re: Как зделать проверку кода
Добавлено: Чт сен 22, 2011 19:32:04
Transistor
Да эсть немношко.
Re: Как зделать проверку кода
Добавлено: Чт сен 22, 2011 19:52:45
rjhaviy
Аlex писал(а):Transistor писал(а):так как чифер восем все во нужно перебрать 7 вариантов.
Вы шутите ?

Посмотрел бы я на Вас как Вы подберёте 8-ми значный код за 7 вариантов, учитывая то, что при неправильном нажатии набор будет сбрасываться, и вы об этом знать не будете. Даже если клавиатура будет из 8-ми цифр, Вы будете подбирать вечно....
Кстати отличный вариант.
Нужен всего один массив, в котором храним запрограммированный пароль, и одна переменная - счетчик правильных нажатий.
Код: Выделить всё
char pass[]="12345"; //пароль
int openflag=0; //флаг открывания;
int index=0; //счетчик правильных нажатий
...
...
...
if (index<sizeof(pass)) // проверяем счетчик, если он меньше размера пароля, то (либо еще не ввели до конца, либо ввели неправильно)
{
if (pass[index]!= (char) (48+keyboard())// если нажатая клавиша не совпадает с тем что хранится по текущему индексу (счетчик правильных нажатий),
index=0; // то сбрасываем счетчик
else
index++; // иначе увеличиваем счетчик правильных нажатий
}
else
openflag=1;
...
...
Код конечноже не идеален... это всего лишь наброски мыслей