Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.15.211.107] |
|
Сообщ.
#1
,
|
|
|
кто-нибудь помогите устроить обработку ip адресса :
как её разделить на части(192.168.11.20 на переменные равные 192,168,11,20) потом как проверить строку с ip на провильность(например если она равна 678.789.YYY.23 то-есть это не правельный ip) |
Сообщ.
#2
,
|
|
|
ip адрес передается/принимается в виде 32-битной величины (одно НО: в сетевом представлении, то есть если ip = 192.168.1.80, то в памяти будет 0x5001A8C0 !!!). Так что уже все разбито
|
Сообщ.
#3
,
|
|
|
а как проверить строку на правельность?
|
Сообщ.
#4
,
|
|
|
а в чем сложность то ??? бери отдельные октеты и сравнивай
|
Сообщ.
#5
,
|
|
|
извините за ламеризм но не мог бы кто-нибудь дать исходник, а?
|
Сообщ.
#6
,
|
|
|
Мог бы.....
Только это для 16 бит..... ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Преобразование строки IP-адреса в число (by 7in) ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .MODEL Tiny,Pascal ; Обратите внимание! .486 .CODE ORG 100h ; COM-программа SMART Start: ; ; Пример преобразует строку в число и выводит байты в виде символов на экран ; ;-- Начало примера ----------------------------------------------------------; push ds lea ax,IP push ax call ProcessIP jnc Ok xor eax,eax ; Если ошибка, просто заносим нули... Ok: int 29h ; Выводит на экран символ с кодом AL mov al,ah int 29h shr eax,16 int 29h mov al,ah int 29h int 20h ; Выходим из программы IP DB '1.2.3.4',0 ;-- Конец примера --------------------------------------------------------; ; На входе: адрес ASCIIZ-строки (в стеке) ; На выходе: IP-адрес в EAX (первое число в AL) и флаг CF сброшен ; ...или... флаг CF установлен, если ошибка ProcessIP proc arg String:DWORD ; В 32-х битах здесь будет :PWORD (вроде) uses DS ; Если DS жалко терять cld lds si,String ; В 32-х: lds esi,String xor edx,edx ; Здесь временно будет IP mov cx,10 mov ax,'.' ; Чтобы сработала ошибка, если в начале точка @@NextNumber: cmp ah,'.' je @@Error ; В начале (или после точки) не может быть точки ror edx,8 ; Следующий байт xor bx,bx ; BX - текущее число inc ch ; CH - счетчик чисел @@NextDigit: mov dl,bl ; Сохраним пока то число, которое есть mov ah,al ; Сохраняем предыдущий байт lodsb ; Читаем следующий байт в AL or al,al jz @@End ; Если это ноль, то на завершение cmp al,'.' je @@NextNumber ; Если точка, то начинаем следующее число ; Переводим новую цифру sub al,'0' ; AL=0..9 (если это цифра) cmp al,9 ja @@Error ; Это не цифра... xchg ax,bx ; AH,AL сохраняем в BX, а BX -> AX mul cl ; Умножаем AL на 10 or ah,ah jnz @@Error ; Если число >= 260, то ошибка xchg bx,ax ; Меняем BX и AX add bl,al ; Добавляем цифру jc @@Error ; Если число = 256..259, то ошибка jmp @@NextDigit ; Следующая цифра @@End: cmp ah,'.' je @@Error ; В конце не может быть точки cmp ch,4 jne @@Error ; Чисел должно быть 4 ! ror edx,8 ; Прокручиваем последний раз xchg eax,edx ; Записываем IP в EAX clc ; CF=NC=0 - ошибки нет mov dl,? ; Это просто небольшой трюк... ORG $-1 ; ...аналогично jmp @@Exit, но на байт меньше @@Error: stc ; CF=CY=1 - ошибка есть @@Exit: ret ProcessIP endp END Start |
Сообщ.
#7
,
|
|
|
Большое спасибо
ты мне очень помог!!!! тханкс!! |