Проверка EURO на корректность серийного номера

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
VKS
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2006 (Чт) 15:40

Проверка EURO на корректность серийного номера

Сообщение VKS » 24.06.2010 (Чт) 14:41

Проверка EURO на корректность серийного номера. Ну а вдруг кому-то пригодится =)) Лучшее место чем "Народный треп" для этого я не нашел..
Вложения
TestEuro.zip
Программа
(3.88 Кб) Скачиваний: 60

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Проверка EURO на корректность серийного номера

Сообщение Debugger » 24.06.2010 (Чт) 15:06

Программа начинена хитрокодом. В плохом смысле хитрокодом.
Код: Выделить всё
If b(0) < 65 Or b(0) > 90 Then End

Плохо
Код: Выделить всё
If b(0) <= 65 Or b(0) => 90 Then End

Так лучше.

Код: Выделить всё
If b(l) < 48 Or b(l) > 57 Then End

Опять же.

Код: Выделить всё
    b() = StrConv(y, vbFromUnicode)
    If UBound(b()) > 0 Then

Тут можно было проще.

VKS
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2006 (Чт) 15:40

Re: Проверка EURO на корректность серийного номера

Сообщение VKS » 24.06.2010 (Чт) 16:09

Debugger писал(а):Программа начинена хитрокодом. В плохом смысле хитрокодом.
Код: Выделить всё
If b(0) < 65 Or b(0) > 90 Then End

Плохо
Код: Выделить всё
If b(0) <= 65 Or b(0) => 90 Then End

Так лучше.

Код: Выделить всё
If b(l) < 48 Or b(l) > 57 Then End

Опять же.

Код: Выделить всё
    b() = StrConv(y, vbFromUnicode)
    If UBound(b()) > 0 Then

Тут можно было проще.


b(0) = чем плохо? проверка первого байта на лат букву.. b(l) - проверить остальное на число

и что тначит "Тут можно было проще." - вы уверены что вы внимательно просмотрети код. суть не только в подсчете байт массива


з.ы. исходник чтобы не качать rar
Код: Выделить всё
Option Explicit

Sub Main()
    Dim x As String
    Dim b() As Byte, z As Byte
    Dim l As Byte, y As Integer
    x = GetSetting(App.Title, "setup", "snum", "")
loop_:
    x = UCase(Trim(InputBox("Введите номер купюры Евро (букву и одиннадцать цифр):", "Проверка Евро на поддлинность по номеру", x)))
    If Len(x) <> 12 Then End
    b() = StrConv(x, vbFromUnicode)
    If b(0) < 65 Or b(0) > 90 Then End
    y = b(0) - 64
    z = 1
repl:
    For l = z To UBound(b())
        If b(l) < 48 Or b(l) > 57 Then End
        y = y + b(l) - 48
    Next l
    b() = StrConv(y, vbFromUnicode)
    If UBound(b()) > 0 Then
        z = 0
        y = 0
        GoTo repl
    End If
    Erase b()
    If y = 8 Then
        If MsgBox("Купюра с таким номером имеет право на жизнь" & vbCrLf & vbCrLf & "Повторим?", vbSystemModal + vbYesNo + vbDefaultButton2) = vbYes Then GoTo loop_
    Else
        If MsgBox("Либо вы ввели не верно номер либо купюра с номером " & x & " ПОДДЕЛКА!" & vbCrLf & vbCrLf & "Повторим?", vbExclamation + vbSystemModal + vbYesNo + vbDefaultButton2) = vbYes Then GoTo loop_
    End If
    SaveSetting App.Title, "setup", "snum", x
    End
End Sub


p.s. p.s.
Debugger писал(а):If b(0) <= 65 Or b(0) => 90 Then End

такой строки у меня нет.. Откуда??

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Проверка EURO на корректность серийного номера

Сообщение iGrok » 24.06.2010 (Чт) 18:05

Это Debugger перестарался с поиском ошибок. Всё правильно написано.
label:
cli
jmp label

Debugger
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1667
Зарегистрирован: 17.06.2006 (Сб) 15:11

Re: Проверка EURO на корректность серийного номера

Сообщение Debugger » 24.06.2010 (Чт) 21:04

Да, ошибся. Но на то были причины - такое впечатление, что код пропустили через обфускатор.
Код: Выделить всё
    Dim b() As Byte, summ As Byte, c As Byte
    b = UCase(InputBox("Введите серийный номер"))   '"X04017624905" например
    If ((UBound(b) <> 23) Or (b(0) < 65) Or (b(0) > 90)) Then Exit Sub
    summ = b(0) - 64    '65=Asc("A")
    For c = 2 To 22 Step 2
        If ((b(c) < 48) Or (b(c) > 58)) Then Exit Sub
        summ = summ + b(c) - 48 '48=Asc("0")
    Next    'Максимум в summ трехзначное число.
    summ = (summ \ 100) + (summ Mod 100) \ 10 + (summ Mod 10) 'Выглядит сложно.
    MsgBox IIf(summ = 8, "Серийный номер верный", "Серийный номер неверный")

То же самое, но годно.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Проверка EURO на корректность серийного номера

Сообщение Proxy » 24.06.2010 (Чт) 21:52

А зачем вообще EURO серийные номера с таким сложным алгоритмом генерации? Неужели это эффективная мера борьбы с подделкой? Уже сейчас на основе сабжа можно кейген для полиграфического штампа создать.

И да: зачем страдать с "- 64", "- 48" и т.д, если можно сразу после ввода преобразовать данные, чтобы последующие операции легче было разобрать. Просто интервал [48,58] смотрится нелепо

И вот ещё что: может я уже подзабыл VB, но...
почему
For c = 12 To 22 Step 2
?
Берём строку 12 символов, помещаем её в массив байт, разве Ascii код каждого символа не будет размещён последовательно в каждый байт массива (не unicode же)? Мб я просто забыл уже эти заморочки, но почему 22 шаг 2?
Follow the white rabbit.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Проверка EURO на корректность серийного номера

Сообщение iGrok » 24.06.2010 (Чт) 23:18

Proxy писал(а):Берём строку 12 символов, помещаем её в массив байт, разве Ascii код каждого символа не будет размещён последовательно в каждый байт массива (не unicode же)? Мб я просто забыл уже эти заморочки, но почему 22 шаг 2?

А с чего вдруг она перестанет быть юникодом?
В коде ТС есть явное преобразование из юникода. В коде Дебаггера - нету.
label:
cli
jmp label

VKS
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 80
Зарегистрирован: 30.11.2006 (Чт) 15:40

Re: Проверка EURO на корректность серийного номера

Сообщение VKS » 24.06.2010 (Чт) 23:59

Proxy писал(а):И да: зачем страдать с "- 64", "- 48" и т.д, если можно сразу после ввода преобразовать данные, чтобы последующие операции легче было разобрать. Просто интервал [48,58] смотрится нелепо


Конечно можно, но думаю если бы сразу после ввода проеобразовать все данные, чтобы последующие операции легче было разобрать, думаю Ваш пост был бы примерно таким:
И да: зачем после ввода преобразовывать все данные, если можно просто произвести пару арифм операций, чтобы не раздувать код. Просто это смотрится нелепо. =))

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Проверка EURO на корректность серийного номера

Сообщение Proxy » 25.06.2010 (Пт) 9:55

А, точно
b() = StrConv(x, vbFromUnicode)
Follow the white rabbit.


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21

    TopList