![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте!
Такая проблема: Нужно разбить строку и записать ее в пять переменных Приблизительно так: Строка например: 192.168.1.101:27015 Например объявлены пять переменных (octetIP1 octetIP2 octetIP3 octetIP4 Port) и строку надо записать следующим образом что бы: octetIP1 = 192 octetIP2 = 168 octetIP3 = 1 octetIP4 = 101 Port = 27015 Перекопал много инфы и ничего не нашел. Проблема в том что IPадрес будет всегда разный и за ранее мне не известен. Подскажите пожалуйста как можно решить задачу? |
#2
|
||||
|
||||
![]() 1) Регекспы.
2) Pos, PosEx, Copy. Ищем первую точку, копируем все до нее, делаем StrToInt, затем ищем следующую точку, и т.д. 3) В лоб: Код:
var data:array[0..4] of integer; ... j := 0; for i := 0 to 4 do data[i] := 0; for i := 1 to length(str) do begin if (str[i] >= '0') and (str[i] <= '9') data[j] := data[j] * 10 + ord(str[i]) - 48; else if (str[i] = '.') or (str[i] = ':') begin j := j + 1; if (j > 4) break; // или сообщение об ошибке end; else break; // или сообщение об ошибке end; ![]() Первые 4 элемента массива будут IP, пятый - порт. З.Ы. Кстати, если это связано с предыдущим постом - зачем сначала все собирать в строку, а потом парсить назад в числа? jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 12.11.2013 в 19:13. |
Этот пользователь сказал Спасибо Bargest за это полезное сообщение: | ||
Shaft (12.11.2013)
|
#3
|
||||
|
||||
![]() Неужели действительно "ничего не нашёл"?
Код:
var ip: string; octetIP1, octetIP2, octetIP3, octetIP4, Port: Integer; begin ip := '192.168.1.101:27015'; octetIP1 := StrToInt(copy(ip,1,pos('.',ip)-1)); delete(ip,1,pos('.',ip)); octetIP2 := StrToInt(copy(ip,1,pos('.',ip)-1)); delete(ip,1,pos('.',ip)); octetIP3 := StrToInt(copy(ip,1,pos('.',ip)-1)); delete(ip,1,pos('.',ip)); octetIP4 := StrToInt(copy(ip,1,pos('.',ip)-1)); delete(ip,1,pos('.',ip)); Port := StrToInt(ip); end; Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj Последний раз редактировалось PhoeniX, 12.11.2013 в 19:12. |
Этот пользователь сказал Спасибо PhoeniX за это полезное сообщение: | ||
Shaft (12.11.2013)
|
#4
|
|||
|
|||
![]() Спасибо! а если не сложно можно не большой примерчик пжл?
P.S. Я создаю свой Master Server, в предыдущей теме я пытался имитировать клиент игры и отправлял запросы на Официальный Master, мне нужно было принять ответ и полностью расшифровать его, что бы я потом мог сам отправлять эти ответы в правильном виде. |
#5
|
|||
|
|||
![]() Ну не то что бы совсем ничего, для моего случая не могу найти(
Спасибо! Буду пробовать |
#6
|
||||
|
||||
![]() Цитата:
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#7
|
||||
|
||||
![]() Цитата:
Вот где тут парсинг строки? jmp $ ; Happy End! The Cake Is A Lie. |
#8
|
||||
|
||||
![]() Кстати да. Первый вопрос надо задавать не "как?" на форуме, а "нафига?" самому себе
![]() Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#9
|
|||
|
|||
![]() У них там алгоритм какой то замудренный, даже я со своими знаниями сделал бы намного проще.
У них обязательный формат ответа: начало FF FF FF FF 66 0A потом First octet of IP address Second octet of IP address Third octet of IP address Fourth octet of IP address Port number https://developer.valvesoftware.com/...Query_Protocol Я уже пробовал отправить фиксированный ответ игре, она его приняла и правильно обработала, но не хотелось бы каждый раз добавлять серверы перекомпиляцией программы, вот делаю чтение из файла P.S. Valve последним патчем почти все переделали, теперь серверы не могут сами добавляться в мастер сервер, инфа на сайте старая, фактически немного не так, даже звуковой кодек для связи по микрофону поменяли. Последний раз редактировалось Shaft, 12.11.2013 в 19:48. |
#10
|
||||
|
||||
![]() То-есть парсинг - для чтения списка из файлов? Ну, тогда понятно. Хотя всё равно не ясно, как эти сервера туда будут добавляться. Если автоматически или другой программой - то проще и правильнее использовать типизированные файлы. Если вручную - то оправдано.
Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#11
|
|||
|
|||
![]() Я хочу в TStringList добавлять из файла все серверы которые в нем записаны в столбик в формате IP:PORT
Этот IP:PORT обязательно разобрать на части пробовал отправить в строчку IP:PORT но игра меня посылает в "лес" Принимает только по частям P.S. серверы после последнего патча добавляются только в ручную администратором мастер-серверов Последний раз редактировалось Shaft, 12.11.2013 в 20:07. |
#12
|
||||
|
||||
![]() разделить "ip : port" на "ip" и "port" можно через WinHttpCrackUrl. разделить "ip":
Код:
uses WinSock, var ip: DWORD; begin ip:=inet_addr('192.168.1.101'); Memo1.Lines.Add(IntToStr((ip shr 24) and $ff)); Memo1.Lines.Add(IntToStr((ip shr 16) and $ff)); Memo1.Lines.Add(IntToStr((ip shr 8) and $ff)); Memo1.Lines.Add(IntToStr((ip shr 0) and $ff)); end; Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 12.11.2013 в 20:47. |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Shaft (13.11.2013)
|
#13
|
||||
|
||||
![]() Простите, не сдержался
![]() ![]() — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Bargest (13.11.2013)
|
#14
|
||||
|
||||
![]() Код:
uses WinSock, WinInet, ... var URL: String; lpUrlComponents: TURLComponents; lpszHostName: array [0..$1f] of Char; dwURL: Integer; begin URL:='192.168.1.101:27015'; ZeroMemory(@lpUrlComponents, SizeOf(TURLComponents)); lpUrlComponents.dwStructSize:=SizeOf(TURLComponents); lpUrlComponents.lpszHostName:=@lpszHostName[0]; lpUrlComponents.dwHostNameLength:=Length(lpszHostName); if InternetCrackUrl(PChar('http://'+URL), 7+Length(URL), ICU_DECODE, lpUrlComponents) then begin dwURL:=inet_addr(@lpszHostName[0]); if dwURL=INADDR_NONE then RaiseLastOSError; // out Memo1.Lines.Add(IntToStr((dwURL shr 0) and $ff)); Memo1.Lines.Add(IntToStr((dwURL shr 8) and $ff)); Memo1.Lines.Add(IntToStr((dwURL shr 16) and $ff)); Memo1.Lines.Add(IntToStr((dwURL shr 24) and $ff)); Memo1.Lines.Add(':'); Memo1.Lines.Add(IntToStr(lpUrlComponents.nPort)); // out end else RaiseLastOSError; end; Пишу программы за еду. __________________ Последний раз редактировалось NumLock, 13.11.2013 в 09:04. |
Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
Shaft (13.11.2013)
|
#15
|
|||
|
|||
![]() Спасибо ребят! Благодаря вашим примерам проблему решил, все работает.
|